更快的方法从R中的大矩阵中的行计数指定值

时间:2017-05-04 15:48:20

标签: r

MC是一个非常大的矩阵,1E6行(或更多)和500列。我试图获得每列的值1到13的出现次数。有时,其中一个值的出现次数将为零。我希望我的最终输出是具有这些计数值的300X13矩阵(或数据帧)。我想知道是否有人可以建议一种比我现有的更有效的方式,具体如下:

MCct<-matrix(0,500,13)
for (j in 1:500){
for (i in 1:13){
MCct[j,i]<-length(which(MC[,j]==i))}}

我不知道那个表是否有效,因为我还需要知道是否发生了零事件......如果可能的话,我无法弄清楚如何做到这一点。而且我对申请只有一点熟悉,所以也许有一种方法可以使用...我还没有成功解决这个问题。

感谢您的帮助, 费雯丽

3 个答案:

答案 0 :(得分:4)

您可以使用sapply(从1到13进行迭代)和colSums(以添加j列)来执行此操作:

MCct <- sapply(1:13, function(i) {
  colSums(MC == i)
})

答案 1 :(得分:1)

假设您有一组您对

感兴趣的值
set <- 1:4
n = length(set)

你有一个矩阵包含那些值,其他

m <- matrix(sample(10, 120, TRUE), 12, 10)

创建一个向量,指示每个匹配值集合中的索引

idx <- match(m, set)

然后使索引对每列唯一

idx <- idx + (col(m) - 1) * n

idx的范围从1(第一列中第一个设置元素的出现次数)到n * ncol(m)(m的最后一列中出现第n个设置元素)。制表idx

的唯一值
v <- tabulate(idx, nbin = n * ncol(m))

n的第一个v元素汇总了设置元素1..n出现在m第一列中的次数。 n的第二个v元素汇总了设置元素1..n出现在m的第二列等中的次数。重塑为所需的矩阵,其中每行代表相应的成员。

matrix(v, ncol=ncol(m))

答案 2 :(得分:0)

table可以计算零次出现,您只需要创建一个具有整个级别范围的因子,例如

apply(MC, 2, function(x) table(factor(x, levels=1:13)))

这不如@Patronus的解决方案那么有效。