【问题标题】:using ffdfdply to split data and get characteristics of each id in the split使用 ffdfdply 拆分数据并获取拆分中每个 id 的特征
【发布时间】:2012-07-07 00:08:07
【问题描述】:

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

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

  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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    FUN=function(x){
      require(doBy)
      summaryBy(Petal.Width ~ Species, data=x, keep.names=TRUE, FUN=min)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-04
      • 2015-01-24
      • 2013-08-18
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多