繁体   English   中英

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

[英]Using tapply, ave functions for ff vectors in 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

目前在包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中的每个块中获得更多的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM