按R中列的总和拆分data.table

按R中列的总和拆分data.table,r,split,data.table,cumsum,R,Split,Data.table,Cumsum,如何按N列的相等累计和拆分data.table?这些数据包括代码,N是每个代码的更大集合中的行数(我在这里没有复制) 我希望能用一个近似值来拆分代码。50000个N的总和,产生不同行长度的数据表,但具有唯一代码,总计约50000个N 实际上,N是随机的,不是模式化的,但这在复制小样本量的数据方面做得很好: dt <- dt <- data.table(code=c(1:500),N=c(rep(c(100:500),100),rep(c(100:500),100),rep(c(100

如何按N列的相等累计和拆分data.table?这些数据包括代码,N是每个代码的更大集合中的行数(我在这里没有复制)

我希望能用一个近似值来拆分代码。50000个N的总和,产生不同行长度的数据表,但具有唯一代码,总计约50000个N

实际上,N是随机的,不是模式化的,但这在复制小样本量的数据方面做得很好:

dt <- dt <- data.table(code=c(1:500),N=c(rep(c(100:500),100),rep(c(100:500),100),rep(c(100:500),100), rep(c(100:500),100), rep(c(100:500),100)))
dt$cumsum <- cumsum(dt$N) 
desired1 <- dt[1:233,] ###first 50,000 cumsum of N
desired2 <- dt[234:359,]
desired3 <- dt[360:565,]
desired4 <- dt[566:713,] ###etc every 50,000 cumsum of N

dt我们使用
%/%
创建一个分组变量用于拆分

dt[, grp := shift(cumsum %/% 50000, fill = 0)]
然后进行
拆分

lst <- split(dt, dt$grp)
tail(lst[[1]], 1)
#   code   N cumsum grp
#1:  233 332  50328   0

很好,那很好用。我学到了一些新东西。感谢@akrun为什么要使用shift而不是lag@akrun?@NealBarsch
shift
数据中的一个函数。表
中的
类型默认为
“lag”
。另一个原因是,使用
shift
可以选择多个列,同时使用
n
值的向量执行滞后或超前