1

我有一个包含近 100 万行(事务)和 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 内存)

4

2 回答 2

3

正如@joran 所建议的那样,使用矩阵(数字,而不是因子)会更好,只需执行以下操作:

rowSums(your_matrix, na.rm = T)
于 2013-09-12T19:15:18.950 回答
1

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

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)))
于 2013-09-12T20:29:52.830 回答