R中大数据的计数算法

时间:2013-09-12 18:35:28

标签: r algorithm bigdata counting

我有一个包含近1M行(事务)和2600列(项目)的大数据框。数据集中的值为1和NA。所有值的数据类型都是因子。我想在数据框的末尾添加一个新列,它显示每行中所有1的总和。

这是我写的R代码:

for(i in 1:nrow(dataset){
    counter<-0
    for(j in 1:ncol(dataset){
        if(!is.na(dataset[i,j])){
           counter<- counter+1
         }
     }
     dataset[i,ncol(dataset)+1]<-counter 
}

但是它在R studio中运行已经很长时间了,因为运行时间是O(n ^ 2)。我想知道是否有其他方法可以做到这一点或改进此算法的方法? (机器有80Gb的内存)

2 个答案:

答案 0 :(得分:3)

使用@joran建议的矩阵(数字而不是因子)会更好,只需这样做:

rowSums(your_matrix, na.rm = T)

答案 1 :(得分:1)

由于eddi answer是最好的,因此更通用的解决方案是对代码进行矢量化(意味着:一次对所有行进行操作):

counter <- rep(0, nrow(dataset))
for(j in 1:ncol(dataset)) {
     counter <- counter + !is.na(dataset[[j]])
}
dataset$no_of_1s <- counter 

一个注意事项:在您的代码中:

dataset[i,ncol(dataset)+1]<-counter 

为每一行创建新列(因为每个步骤还有一列),因此最终data.frame将包含1M行和1M列(因此它不适合您的内存)。


另一种选择是使用Reduce

dataset$no_of_1s <- Reduce(function(a,b) a+!is.na(b), dataset, init=integer(nrow(dataset)))