【问题标题】:data.table calculation for last row per group [duplicate]每组最后一行的data.table计算[重复]
【发布时间】:2019-08-20 12:38:57
【问题描述】:

当我有一个分组的 data.table 时

library(data.table)
dat <- data.table(id=1:10, group=rep(1:2, each=5), x=rnorm(10))

> dat
    id group           x
 1:  1     1 -0.39384959
 2:  2     1 -0.03081369
 3:  3     1 -1.30571673
 4:  4     1 -1.82379155
 5:  5     1  2.36751011
 6:  6     2  0.21523454
 7:  7     2 -0.18905780
 8:  8     2  1.80707868
 9:  9     2  0.88348164
10: 10     2  0.38374826

我想将每个组中最后一个idx 设置为零,我想知道如何实现。我的看法是dat[.N, x:=0, by=group],但这不起作用,因为这只会改变 id 10 的值。这是为什么呢?小插曲在这里似乎没有帮助。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这里有点原始:

    dat[, x := ifelse(seq_along(x) == .N, 0, x), group][]
    

    更简洁:

    dat[, x := c(x[-.N], 0), group]
    

    可能更有效的是:

    dat[dat[, .I[.N], group]$V1, x := 0]
    

    【讨论】:

      【解决方案2】:

      可以使用:

      dat[,x:= ifelse(.I == last(.I),0,x),by=.(group)][]
      
      
      
           id group          x
       1:  1     1 -0.6291830
       2:  2     1 -0.1840518
       3:  3     1  0.5242331
       4:  4     1 -1.8604996
       5:  5     1  0.0000000
       6:  6     2 -1.3966630
       7:  7     2  0.8715680
       8:  8     2 -0.6207351
       9:  9     2 -0.3021389
      10: 10     2  0.0000000
      

      【讨论】:

        【解决方案3】:

        也许你可以使用replace

        library(data.table)
        dat[, x := replace(x, seq_len(.N) == .N, 0),by=group]
        
        dat
        #    id group          x
        # 1:  1     1 -0.3148360
        # 2:  2     1 -0.1737918
        # 3:  3     1 -0.6768283
        # 4:  4     1  0.4066397
        # 5:  5     1  0.0000000
        # 6:  6     2 -0.3606155
        # 7:  7     2  0.1965135
        # 8:  8     2  0.1488247
        # 9:  9     2 -1.8684589
        #10: 10     2  0.0000000
        

        或者@sindri_baldur 建议的更简单的方法

        dat[, x := replace(x, .N, 0),by=group]
        

        【讨论】:

        • 可以简化为replace(x, .N, 0)
        猜你喜欢
        • 1970-01-01
        • 2019-09-03
        • 2021-11-19
        • 2022-07-11
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 2022-06-22
        • 1970-01-01
        相关资源
        最近更新 更多