簡體   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