目前ff包中没有实现ff_vectors的tapply或ave功能。但是你可以使用ffbase中的功能。
让我们详细说明一些更大的数据集。
require(ffbase)
a <- ffrep.int(ff(1:100000), times=500)
b <- ffrandom(n=length(a), rfun = runif)
c <- ffseq_len(length(a))
df <- ffdf(a = a, b = b, c = c)
dim(df)
对于您的简单汇总方法,您可以使用binned_sum,您可以按照以下方式轻松提取长度。请注意,binned_sum需要一个ff factor对象在bin中,可以通过如下方式获得as.character.ff。
df$groupbyfactor <- as.character(df$a)
agg <- binned_sum(x=df$b, bin=df$groupbyfactor, nbins = length(levels(df$groupbyfactor)))
head(agg)
agg[, "count"]
对于更复杂的聚合,您可以在ffbase中使用ffdfdply。我经常做的是将它与一些data.table语句结合使用,像这样:
require(data.table)
agg <- ffdfdply(df, split=df$groupbyfactor, FUN=function(x){
x <- as.data.table(x)
result <- x[, list(b.mean = mean(b), b.median = median(b), b.length = length(b), whatever = b[c == max(c)][1]), by = list(a)]
result <- as.data.frame(result)
result
})
class(agg)
aggg <- as.data.frame(agg)
这将把你的数据分成一组一组的块,每组块的大小由元素数量决定。你可以在此基础上应用函数,比如有些 data.table 语句就需要你的数据在内存中。所有块的结果都会合并成一个新的 ffdf(如果你的 RAM 允许的话,你还可以把它放入 RAM 中)。
这些块的大小由 getOption("ffbatchbytes") 控制。如果你的 RAM 更大,那么效果就更好,因为它允许你在每个块中获取更多的数据。
tapply(df[, 'a'], df[, 'b'], length)
。 - jbaums