使用tapply,ave函数用于R中的ff向量

时间:2013-05-09 20:38:27

标签: r

我一直在尝试使用tapplyaveddply按变量组(年龄,性别)创建统计信息。我无法成功使用上述R命令。

library("ff")
df <- as.ffdf(data.frame(a=c(1,1,1:3,1:5), b=c(10:1), c=(1:10)))
tapply(df$a, df$b, length)

我收到的错误消息是

Error in as.vmode(value, vmode) : 
  argument "value" is missing, with no default

Error in byMean(df$b, df$a) : object 'index' not found

1 个答案:

答案 0 :(得分:2)

目前在包ff中实现的ff_vector目前没有tapply或ave。 但你可以做的是使用ffbase中的功能。 让我们详细说明一些更大的数据集

require(ffbase)
a <- ffrep.int(ff(1:100000), times=500) ## 50Mio records on disk - not in RAM
b <- ffrandom(n=length(a), rfun = runif)
c <- ffseq_len(length(a))
df <- ffdf(a = a, b = b, c = c) ## on disk
dim(df)

对于简单的聚合方法,您可以使用binned_sum,您可以轻松地提取长度,如下所示。标记binned_sum需要bin中的ff因子对象,可以通过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) ## Puts the data in RAM!

这会将您的数据放入RAM中,并根据您可以应用函数的分组元素组,例如一些data.table语句,这些语句需要您的数据在RAM中。基于您应用该函数的所有块的结果接下来组合在一个新的ffdf中,以便您可以进一步使用它,或者如果您的RAM允许该大小,则将其放入RAM中。

块的大小由getOption(“ffbatchbytes”)控制。因此,如果你有更多的RAM,那就更好了,因为它可以让你在RAM中的每个块中获得更多的数据。