【问题标题】:R ffdfdply split issueR ffdfdply 拆分问题
【发布时间】:2013-07-22 09:51:23
【问题描述】:

我对 R,ffdfdply 函数有问题

a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1)))

ffdfdply(a, split=a$c, FUN= function(x) {data.frame(cumsum(x$d))}, trace=T)

它生成的输出只是一个累积和,不考虑拆分标准。

我需要这样的输出

c   cumsum
4    1
4    2
4    3
4    4
4    4
5    0
5    1
5    1
5    2
5    3

我们可以在“拆分”下包含多个列吗?如果有人也提供一个例子,那就太好了。

谢谢。


@jwijffels,我在其他数据集上测试您的解决方案

i=as.ffdf(data.frame(a=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2), b=c(1,4,6,2,5,3,1,4,3,2,8,7,1,3,5,4,2,6,3,1,2), c=c(1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2), d=c(1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1,1,1,0)))

我收到的输出不正确。我需要在 a 列和 c 列的基础上计算 d 列的累积总和。

以下步骤是正确的,并给出了正确的结果

idx <- ffdforder(i[c("a","c","b")])
ordered_i <- i[idx, ]
ordered_i$key_a_c <- ikey(ordered_i[c("a", "c")])

但是当我尝试累积总和时,得到的结果不正确。

cumsum_i <- ffdfdply(ordered_i, split=as.character(ordered_i$key_a_c), FUN= function(x) {
    ## Data in RAM, on which you can use data.table
    x <- as.data.table(x)
    result <- x[, cumsum_a_c := cumsum(x$d), by = list(key_a_c)]
    as.data.frame(result)
}, trace=T)

请帮忙。我需要在大数据上运行这组命令。

【问题讨论】:

标签: r


【解决方案1】:

正确的用法应该是这样

require(ffbase)
require(data.table)
a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1)))
ffdfdply(a, split=as.character(a$c), FUN= function(x) {
  ## Data in RAM, on which you can use data.table
  x <- as.data.table(x)
  result <- x[, cumsum := cumsum(d), by = list(c)]
  as.data.frame(result)
  }, trace=T)

如果您想按 2 列拆分,只需创建一个将两列合并的新列并将其用作拆分。请参阅?ikey 创建该列

【讨论】:

  • 如果我们有大数据,那么我想 x
  • 不,您不会有内存问题。您在“x”中得到的是“a”ffdf 的子集,其中一个或多个拆分元素的数据组被放入 RAM。您放入 RAM 并在其上应用 FUN 的子集的大小由 BATCHBYTES 控制。
  • 谢谢...太好了
  • 你是对的,我没有使用正确的 data.table 语法里面的乐趣。它是 cumsum := cumsum(d) 而不是 cumsum := cumsum(x$d)。更新了答案
【解决方案2】:

在这里阅读帮助会有所帮助,来自?ffdfdply

这个函数实际上并不分割数据。为了减少 在有大量的情况下,数据被放入 RAM 的次数 拆分级别,该函数提取拆分元素组,这些拆分元素可以 根据 BATCHBYTES 放入 RAM。

和....

请确保您的 FUN 涵盖了多个拆分元素可以位于一大块 应用 FUN 的数据。

因此,根据我的阅读,您实际上需要一个拆分组合样式的函数,该函数也适用于 ffdfdply 调用的函数中的组。像这样使用ave:

a$c <- with(a, as.integer(c))
ffdfdply(
    a,
    split=a$c,
    function(x) data.frame(c=x$c,cumsum=ave(x$d,x$c,FUN=cumsum)), 
    trace=T
)

结果:

   c cumsum
1  4      1
2  4      2
3  4      3
4  4      3
5  4      3
6  5      0
7  5      1
8  5      1
9  5      2
10 5      3

【讨论】:

  • 谢谢.. 如果我错了,请纠正我。 BATCHBYTES 在 ffdfdply 中扮演着重要的角色。如果我们不确定数据和固定的 BATCHBYTES 将导致不一致的结果。您能否举个例子,在拆分下包含多个列。
  • @Ajay - 我对ff 不是很了解,但听起来ffdfdply 可能会将几个拆分组合并为一个BATCHBYTE,具体取决于每个组的大小和BATCHBYTE。因此,您必须具有 另一个 分组功能,以防批处理中有 >1 个组。
  • 是的,这就是为什么文档声明“请确保您的 FUN 涵盖这样一个事实,即多个拆分元素可以位于应用 FUN 的数据块中。”
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多