在R中使用tapply、ave函数处理ff向量

3

我一直在尝试使用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

5
请提供您的示例代码 - sgibb
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) 将数据框转换为ffdf格式,其中a列包含1、1、1到3、1到5的数字,b列包含10到1的数字,c列包含1到10的数字。然后使用tapply函数,按照df$b列中的值对df$a列进行分组,并计算每个组中元素的数量。 - askabra
@sgibb,感谢您的编辑,我在这里还很新。 - askabra
2
尝试使用tapply(df[, 'a'], df[, 'b'], length) - jbaums
1个回答

2

目前ff包中没有实现ff_vectors的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需要一个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) ## Puts the data in RAM!

这将把你的数据分成一组一组的块,每组块的大小由元素数量决定。你可以在此基础上应用函数,比如有些 data.table 语句就需要你的数据在内存中。所有块的结果都会合并成一个新的 ffdf(如果你的 RAM 允许的话,你还可以把它放入 RAM 中)。
这些块的大小由 getOption("ffbatchbytes") 控制。如果你的 RAM 更大,那么效果就更好,因为它允许你在每个块中获取更多的数据。

谢谢!在语句 df$groupbyfactor <- as.character(df$a) 中,我遇到了错误:Error: cannot allocate vector of size 190.7 Mb我以为这应该存储在磁盘上。 - askabra
所有数据都存储在磁盘上。对于除因子以外的所有模式,虚拟部分仅有几千字节大小。对于因子,所有因子水平也存储在RAM中,而数据存储在磁盘上。因此,如果您无法将所有因子水平加载到RAM中,则会出现错误。当发生这种情况时,大多数情况下是因为您在RAM中还有其他对象,这会导致问题。在这个例子中,我不认为100000个因子级别是您在r会话期间溢出的原因,而是其他一些RAM中存在的东西。 - user1600826

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接