【问题标题】:Split data.table by cumsum of column in R按 R 中列的累积和拆分 data.table
【发布时间】:2018-07-16 04:50:28
【问题描述】:

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

我希望能够按 aprox 拆分代码。 50,000 个 N 的 cumsum,生成行长不一的 data.tables,但唯一的代码总和约为 50,000 个 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

【问题讨论】:

    标签: r split data.table cumsum


    【解决方案1】:

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

    dt[, grp := shift(cumsum %/% 50000, fill = 0)]
    

    然后执行split

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

    【讨论】:

    • 很好,这会很完美。学到了一些新东西。谢谢@akrun
    • 为什么使用 shift 而不是 lag @akrun?
    • @NealBarsch shiftdata.table 中的一个函数,其中type 默认为"lag"。另一个原因是,使用shift,您可以选择多个列,同时使用n 值的向量进行滞后或超前
    猜你喜欢
    • 2016-02-19
    • 2019-02-24
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多