提问人:Anne 提问时间:10/16/2020 最后编辑:Henry CyrankaAnne 更新时间:10/16/2020 访问量:103
如何计算数据组合的出现次数并保存在R中的矩阵中?
How to count number of occurrences of data combinations and save in a matrix in R?
问:
我有一个问题,我试图创建一个包含特定“坐标”出现次数的矩阵。我在 R 中工作。
举例来说,这是我的数据(部分):
pre = c(3,1,3,2,2,4,3,5,3,4,6,5,6,5,4,5,6,6,5,6,5,7,6,7,7,7,4,8,4,8,8,4,4,8,3,9,8,6,9,8)
post = c(4,3,5,3,4,6,5,6,5,4,5,6,6,5,6,5,7,6,7,7,7,4,8,4,8,8,4,4,8,3,9,8,6,9,8,8,9,7,9,9)
df = data.frame(pre,post)
然后,我使用可能的坐标维度(所有数据中的范围 1-20)定义此输出矩阵:
matrix = matrix(NA, nrow=20, ncol=20)
colnames(matrix) = seq(1,20,1)
rownames(matrix) = seq(1,20,1)
然后,我需要一个循环来运行我的数据,并存储数据中存在多少个特定的前后组合:
for (i in 1:40){matrix[df$post[i], df$pre[i]] = 1}
这的工作原理是,输出现在显示数据中出现了哪些“坐标”,但没有显示多少次。 例如,我知道 pre=4、post=4 发生了两次。 因此,循环需要记住已经发生的组合,并且需要再添加一个 1,但我不知道如何对此进行编程。
我希望有人能帮上忙, 安妮
答:
0赞
akrun
10/16/2020
#1
我们可以用它来做到这一点。将“pre”、“post”列转换为指定为 1 到 20,然后使用table
factor
levels
table
table(factor(df$pre, levels = 1:20), factor(df$post, levels = 1:20))
如果我们使用已经创建的“矩阵”,则一个选项是
out <- as.data.frame(table(df))
matrix[as.matrix(out[1:2])] <- out$Freq
0赞
Valeri Voev
10/16/2020
#2
您可以用零而不是零初始化矩阵,然后像这样递增矩阵值:NA
pre = c(3,1,3,2,2,4,3,5,3,4,6,5,6,5,4,5,6,6,5,6,5,7,6,7,7,7,4,8,4,8,8,4,4,8,3,9,8,6,9,8)
post = c(4,3,5,3,4,6,5,6,5,4,5,6,6,5,6,5,7,6,7,7,7,4,8,4,8,8,4,4,8,3,9,8,6,9,8,8,9,7,9,9)
df = data.frame(pre,post)
matrix = matrix(0, nrow=20, ncol=20)
colnames(matrix) = seq(1,20,1)
rownames(matrix) = seq(1,20,1)
for (i in 1:40){matrix[df$post[i], df$pre[i]] = matrix[df$post[i], df$pre[i]] + 1}
顺便说一句,如果出于任何其他原因不需要矩阵,则不需要矩阵的设置。colnames
rownames
评论
0赞
Anne
10/16/2020
非常感谢你!它确实有效。我还有一个问题。在整个数据集中,也会出现零。R 定义从 1 开始的行/列,因此使用 matrix = matrix(0, nrow=21, ncol=21) 并不能解决问题。你对如何处理这个问题有什么建议吗?
0赞
Anne
10/16/2020
我成功地解决了这个问题。我已将数据集中的所有原始零更改为 21,然后将矩阵设置为 21 行和 21 列。循环后,我将第 21 行和第 21 列(实际上描绘了数据中零的组合)排序为矩阵中的第一行和列 (matrix2 = matrix[c(21, 1:20), c(21, 1:20)])。然后将列和行从 0 重命名为 20。
评论