我正在使用大型数据集(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
关于如何避免这些错误的任何想法?
答案 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, ]