代码之家  ›  专栏  ›  技术社区  ›  Neal Barsch

根据R列data.table中的行值生成group by条件

  •  0
  • Neal Barsch  · 技术社区  · 6 年前

    我想根据行值中的条件将R中的data.table拆分为多个组。我已经进行了广泛的搜索,但找不到有效的data.table方法来执行此操作(我不想寻找跨行的循环)

    我有这样的数据:

    library(data.table)
    dt1 <- data.table( x=1:139, t=c(rep(c(1:5),10),120928,rep(c(6:10),9), 10400,rep(c(13:19),6)))
    

    我想把大的数字(超过一个可设置的值)分组,并给出下面的例子:

    dt.desired <- data.table( x=1:139, t=c(rep(c(1:5),10),120928,rep(c(6:10),9), 10400,rep(c(13:19),6)), group=c(rep(1,50),rep(2,46),rep(3,43)))
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   dayne    6 年前
    dt1[ , group := cumsum(t > 200) + 1]
    
    dt1[t > 200]
    #     x      t group
    # 1: 51 120928     2
    # 2: 97  10400     3
    dt.desired[t > 200]
    #     x      t group
    # 1: 51 120928     2
    # 2: 97  10400     3
    
        2
  •  0
  •   DanY    6 年前

    你可以用这样的测试 t>100 找到大的值。你可以用 cumsum() 为每一组行(不包括大数)获取一个运行整数。

    # assuming you can define "large" as >100
    dt1[ , islarge := t>100]
    dt1[ , group := shift(cumsum(islarge))]
    

    我知道你想让这个大数字成为它上面的一部分。为此,请使用 shift() 然后填写第一个值(后面是NA 移位() 是跑步。

    # a little cleanup 
    # (fix first value and start group at 1 instead of 0)
    dt1[1, group := 0]
    dt1[ , group := group+1]