【问题标题】:Doing rolling custom computations using data.table for multiple columns使用 data.table 对多列进行滚动自定义计算
【发布时间】:2017-10-03 03:50:19
【问题描述】:

我正在使用下面的代码对列进行滚动计算

dt <- data.table(x1=1:8,x2=2:10,x3=4:11,x4=6:12)
N = 3L
dt[, y1 := (2*dt$x1[.I] -dt$x1[(.I+N-1L)]), by=1:nrow(dt)]
dt


     x1 x2 x3 x4 y1
1:  1  2  4  6 -1
2:  2  3  5  7  0
3:  3  4  6  8  1
4:  4  5  7  9  2
5:  5  6  8 10  3
6:  6  7  9 11  4
7:  7  8 10 12 13
8:  8  9 11  6 NA
9:  1 10  4  7 NA

sdcols=paste0("x",1:4) 

如何使用 sdcols 为列 x1 到 x4 实现相同的结果,创建新列 y1 到 y4

【问题讨论】:

    标签: r data.table lead


    【解决方案1】:

    也许我们不需要按操作分组

    nm1 <- names(dt)
    dt[,  paste0('y', seq_along(nm1)) := lapply(.SD, 
        function(x) c((2*shift(x)- shift(x, type = 'lead'))[-1], NA)), .SDcols = nm1]
    dt
    #   x1 x2 x3 x4 y1 y2 y3 y4
    #1:  1  2  4  6 -1  0  2  4
    #2:  2  3  5  7  0  1  3  5
    #3:  3  4  6  8  1  2  4  6
    #4:  4  5  7  9  2  3  5  7
    #5:  5  6  8 10  3  4  6  8
    #6:  6  7  9 11  4  5  7 16
    #7:  7  8 10 12 13  6 16 17
    #8:  8  9 11  6 NA NA NA NA
    #9:  1 10  4  7 NA NA NA NA
    

    【讨论】:

    • 该解决方案有效且优雅。我在解码这块 c((2*shift(x)- shift(x, type = 'lead'))[-1], NA)) 时遇到问题。为什么使用 c,为什么使用 [-1] 以及为什么使用 NA?你能帮忙澄清一下吗?
    • @ashleych 我用它来删除第一个观察结果,然后在末尾附加 NA 以获得经验输出
    • 我真的不明白这将如何转换为 OP 变量 N = 3 的其他值。
    • @Frank 除了提供的示例中的值之外,我没有使用其他值对其进行测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2021-08-20
    • 2018-03-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多