我有一个包含近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的内存)
答案 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)))