2017-05-04 92 views
0

MC是一个非常大的矩阵,1E6行(或更多)和500列。我正在尝试为每列获取值1到13的出现次数。有时候,其中一个值的出现次数将为零。我希望我的最终输出是具有这些计数值的300X13矩阵(或数据帧)。我想知道如果任何人都可以提出一个更有效的方式那么我现在有,这是如下:计算R中大矩阵行中指定值的更快速方法

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

我不知道该表的作品,因为我还需要知道,如果零个事件发生...如果可能,我无法弄清楚如何做到这一点。而且我对应用程序只有一点熟悉,所以也许有一种方法可以使用它......我还没有成功地弄清楚这个问题。

感谢您的帮助, 费雯丽

回答

4

你可以做到这一点与sapplycolSums(从1到13进行迭代)(加起来的j列):

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

你也可以用'colSums(MC == i)'替换'apply'函数的调用,我认为它更快。 – Lamia

+0

@Lamia你100%的权利,良好的捕获。 –

+0

感谢您的帮助! – Vivien

0

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

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

虽然这不像@Patronus的解决方案那么高效。

+0

感谢您的回答! – Vivien

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)(第n组元件的发生在m的最后一列)。制表的idx

v <- tabulate(idx, nbin = n * ncol(m)) 

v第一n元件总结的次数中的唯一值设定元件1..N出现在m第一列。 v的第二个n元素总结了设置元素1..n出现在第二列m等中的次数。重塑为期望的矩阵,其中每行表示该组的对应成员。

matrix(v, ncol=ncol(m)) 
+0

感谢您的回答! – Vivien