R ffdfdply拆分问题

时间:2013-07-22 09:51:24

标签: r

我的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)

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

2 个答案:

答案 0 :(得分:4)

正确的用法是

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

答案 1 :(得分:1)

?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