到目前为止,我一直在使用 Sqldf 和 R 函数的组合来管理我的数据集。但是,我需要在大型数据集上执行一堆左连接,即使使用 sqldf dbname=tempfile(),我也会开始耗尽内存。
我注意到 FF 的第一件事是我无法将它传递给 sqldf。我注意到的第二件事是我的典型函数并不都在 ff 中工作。
我正常加入的例子
base <- read.csv(filename)
base <- sqldf("select * from base where DATE > 20120101")
for (j in list.files()){
temp <- read.csv(tempfile)
temp <- sqldf("select MATCH_KEY, DATE from temp")
base <- sqldf("select * from base NATURAL LEFT OUTER JOIN temp")
}
对于 ffbase,我不能简单地使用“as.ffdf(temp)”。解决方法是编写一个物理临时文件,然后将其作为 ff 读入,然后与 ff-s 进行合并。我觉得这不是与 ff 合作的好方法。有更好的选择吗?
我面临的第二个问题可能是由于我对 ff 不熟悉。我有一个简单的代码,只是不知道如何在 ff 中实现。基本上我有数据框基础,我想循环并计算值大于某个数字的次数。使用我的日期示例的想法(实际上我也在检查数字、比率等,但想法总是相同的)。
checks <- c(20010101,20020101,20030101)
summary <- matrix(0,ncol=dim(base)[2],nrow=length(checks))
for (i in checks){
for (j in dim(base)[2]){
summary[i,j]<-sum(base[,j]>=i)
}}
这些功能也不适用于 ff 。现在我实际上正在使用 sqldf 读取文件,然后写入一个临时文件。用 ff 读那些,然后做所有的合并业务。然后,我再次写入一个临时文件,并将其作为普通文件读回。哎呀!有什么改进建议吗?
[编辑]
一个大问题是,如何使用 as.ffdf 转换通过 sqldf (temp <-sqldf(stuff)) 创建的表。我收到一个错误:“ff 中的错误(initdata = initdata,长度 = 长度,级别 = 级别,有序 = 有序,:未实现 vmode '字符'”
此外,我似乎无法在 ff 中使用的两个函数示例。
1)我经常用 0 替换文件中的缺失值,以将它们与合并创建的缺失区分开来。我这样做是通过
DF[is.na(DF)] <- 0
使用 ff 似乎涉及更多,我担心失去可读性:Replace NAs in a ffdf object
2)对列或行求和,寻找特定值。例如,计算“R”在列中出现的次数。在 ff?