1

在 R 中,我ffdf用来处理大型数据集。我想ffdfdplyffbase包中使用根据某个变量(var)拆分数据,然后为所有具有 var 唯一值的观察值计算一些特征(例如:var 的每个唯一值的观察次数)。为了看看这是否可行,ffdfdply我执行了下面描述的示例。

我希望它会在每个 Species 上拆分,然后计算每个 Species 的最小值Petal.WidthSpecies然后返回两列,每列包含三个条目,其中列出了那个和Species最小值。预期输出:Petal.WidthSpecies

  Species    min_pw
1 setosa     0.1       
2 versicolor 1.0       
3 virginica  1.4  

然而,BATCHBYTES=5000它将使用两个拆分,一个包含两个 Species,另一个包含一个 Species。这导致以下结果:

  Species   min_pw
1 setosa    0.1      
2 virginica 1.4    

当我更改BATCHBYTES为 2000 时,这将强制ffdfdply使用三个拆分,从而导致上面发布的预期输出。但是,我希望有另一种方法来强制拆分为分配给“拆分”的变量的每个唯一值。有没有办法做到这一点?或者您有任何其他建议来获得我需要的结果吗?

ffiris <- as.ffdf(iris)
result <- ffdfdply(x = ffiris,
                   split = ffiris$Species,
                   FUN = function(x) {
                      min_pw <- min(x$Petal.Width)
                      data.frame(Species=x$Species, min_pw= min_pw)
                   },
                   BATCHBYTES = 5000,
                   trace=TRUE
)
dim(result)
dim(iris)
result
4

1 回答 1

5

ffdfdply 功能是在您有很多拆分元素时设计的,例如当您有 1000000 个客户并且您希望内存中的数据至少按客户拆分但可能有更多客户,如果您的 RAM 允许这样内部不需要做ff 其中 1000000 次。这就是为什么 ffdfdply 的文档指出:

请确保您的 FUN 涵盖这样一个事实,即多个拆分元素可以位于应用 FUN 的一大块数据中。因此,您的问题的解决方案是在 FUN 中涵盖这一点,如下所示

FUN=function(x){
  require(doBy)
  summaryBy(Petal.Width ~ Species, data=x, keep.names=TRUE, FUN=min)
}
于 2012-07-06T10:35:54.970 回答