【发布时间】:2019-01-18 16:06:28
【问题描述】:
我需要一个有效的 data.table 解决方案来过滤到每 300 个列的累积总和的第一个和最后一个实例。我的真实数据集是数百万行,所以我不是在寻找循环解决方案。
#Example data:
dt <- data.table(idcolref=c(1:1000),y=rep(10,1000))
下面是一个执行我想要的示例循环,但它对于大型 data.table 来说太慢了。
###example of a loop that produces the result I want but is too slow
library(foreach)
dt[,grp:=1,]
dt[,cumsum:=0,]
grp <- 1
foreach(a=2:nrow(dt))%do%{
dt[a,"cumsum"]<-dt[a,"y"]+dt[a-1,"cumsum"]
if(dt[a,"cumsum"]>300){
dt[a,"grp"] <- grp
grp <- grp+1
dt[a,"cumsum"]<-0
}else{
dt[a,"grp"]<-dt[a-1,"grp"]
}
}
dt.desired <- foreach(a=2:nrow(dt),.combine=rbind)%do%{
if(dt[a,"grp"]!=dt[a-1,"grp"]){
dt[c(a-1,a),]
}
}
dt.desired <- rbind(dt[1,],dt.desired)
dt.desired <- rbind(dt.desired,dt[nrow(dt),])
如何使用快速矢量化 data.table 函数获得相同的结果?谢谢!
【问题讨论】:
-
x 是你的组吗?
-
不行,我需要根据x(或y)生成组
-
你能不能再清楚一点,你的id栏是哪个?
-
您确定您的
dt.desired正确吗?如果您在dt[, id := .I]上放置一个索引列,则表明第一组是第 1 行和第 122 行。? -
为什么你的输出的第一个值是 0?不应该是 10 吗?
标签: r filter data.table cumsum