R中大数据的计数算法

Posted

技术标签:

【中文标题】R中大数据的计数算法【英文标题】:Counting algorithm for big data in R 【发布时间】:2013-09-12 18:35:28 【问题描述】:

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

【问题讨论】:

如果您的数据只有 1 并且 NA 使用矩阵(或 data.table)而不是数据框。看看?apply,或者如果太慢,Rcpp。 【参考方案1】:

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

rowSums(your_matrix, na.rm = T)

【讨论】:

【参考方案2】:

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)))

【讨论】:

以上是关于R中大数据的计数算法的主要内容,如果未能解决你的问题,请参考以下文章

加快R中大数据的for循环处理时间

基于R中大型数据集中没有足够的重复数据删除行

R中大型数据集中多个列的自动grep()

怎样向SQL Server中大批量插入数据

一看就懂的大数据排序算法:如何给100万用户数据排序?

一看就懂的大数据排序算法:如何给100万用户数据排序?