[英]R ffdfdply split issue
我对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)
请帮忙。 我需要在大数据上运行这些命令集。
正确的用法是这样
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
以创建该列
从?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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.