从ffdf对象对数据帧进行计算

时间:2013-08-21 16:04:19

标签: r ff

我正在使用大型数据集(3.5M行和40列),我需要清除一些值,以便我能够计算在开始围绕数据制定模型时我需要的其他参数。 / p>

问题是应用我一直在使用的for循环需要永远,所以我想尝试使用ff包。数据框称为数据,它由一堆银行的客户信息组成。它是作为.csv文件导入的。我需要做的是删除所有客户(标记为Serial),如果他们的AverageStanding变量是负数

> ffd<-as.ffdf(data)
> lastserial = tail(ffd$Serial,1)
> for(k in 1:lastserial){
+   tempvecWith <- vector()
+   tempvecWith <- ffd[ffd$Serial==k, ]$AverageStanding
+   if(any(tempvecWith < 0)){
+     ffd_clean<- ffd[!ffd$Serial ==k, ]
+   }
+ }

这是我收到的错误:

Error in as.hi.integer(x, maxindex = maxindex, dim = dim, vw = vw, pack = pack) : 
NAs in as.hi.integer

关于如何避免这些错误的任何想法?

1 个答案:

答案 0 :(得分:1)

错误来自代码ffd[ffd$Serial==k, ]的这一部分。即ffd$Serial==k返回ff逻辑向量。但是,如果要索引或子集ff向量或ffdf,则需要提供索引号,而不是逻辑向量。您可以使用包ffbase中的ffwhich将逻辑的ff向量转换为索引号的ff向量。

所以对于你的问题,我相信你正在寻找这种代码(没有经过测试,因为你没有提供任何数据)。

require(ffbase)
idx <- ffd$AverageStanding < 0
idx <- ffwhich(idx, idx==TRUE)
open(ffd)
serials.with.negative <- ffd$Serial[idx]
serials.with.negative <- unique(serials.with.negative)
ffd$is.customer.with.negative.avgstanding <- ffd$Serial %in% serials.with.negative

idx <- ffd$is.customer.with.negative.avgstanding == FALSE
idx <- ffwhich(idx, idx==TRUE)
open(ffd)
ffd_clean <- ffd[idx, ]