【问题标题】:remove consecutive values in a data table删除数据表中的连续值
【发布时间】:2020-10-02 08:36:49
【问题描述】:

我正在尝试删除数据表中的连续值。因此,在这种情况下,如果a 列中有超过 2 个零,我想消除每个变量的所有行。所以我需要像maxgap 这样的东西来定义允许多少连续零以实现一定的灵活性。

这是一个例子:

library(data.table)
dt <- data.table(a = c(1, 2, 1, 0, 0, 0, 0, 1, 2),
                 b = as.factor(c("x", "y", "x", "x", "y", "z", "x", "y", "y")),
                 c = c(2, 5, 1, 0, 3, 6, 0, 3, 4))

结果如下:

dtRes <- data.table(a = c(1, 2, 1, 1, 2),
                    b = as.factor(c("x", "y", "x", "y", "y")),
                    c = c(2, 5, 1, 3, 4))

【问题讨论】:

    标签: r data.table na


    【解决方案1】:

    使用rle

    library(data.table)
    dt[!with(rle(a == 0), rep(values * lengths > 2, lengths))]
    
    #   a b c
    #1: 1 x 2
    #2: 2 y 5
    #3: 1 x 1
    #4: 1 y 3
    #5: 2 y 4
    

    【讨论】:

    • 您的解决方案效果很好,而且速度非常快!我对我的数据进行了基准测试,它比使用 rleid 函数的解决方案快 15-20 倍。非常感谢你:)
    【解决方案2】:

    你范做:

    library("data.table")
    
    dt <- data.table(a = c(1, 2, 1, 0, 0, 0, 0, 1, 2),
                     b = as.factor(c("x", "y", "x", "x", "y", "z", "x", "y", "y")),
                     c = c(2, 5, 1, 0, 3, 6, 0, 3, 4))
    
    dt[, v:=rleidv(a==0)][]
    dt[, if (a[1]!=0 | .N<3) .SD, v]
    # > dt[, if (a[1]!=0 | .N<3) .SD, v]
    #    v a b c
    # 1: 1 1 x 2
    # 2: 1 2 y 5
    # 3: 1 1 x 1
    # 4: 3 1 y 3
    # 5: 3 2 y 4
    

    【讨论】:

      【解决方案3】:

      我们可以使用rleid

      library(data.table)
      dt[dt[, rleid(a == 0) * (a != 0) > 0]]
      #   a b c
      #1: 1 x 2
      #2: 2 y 5
      #3: 1 x 1
      #4: 1 y 3
      #5: 2 y 4
      

      .I

      dt[dt[, .I[!(all(a == 0) & .N > 2)], rleid(a == 0)]$V1]
      #   a b c
      #1: 1 x 2
      #2: 2 y 5
      #3: 1 x 1
      #4: 1 y 3
      #5: 2 y 4
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        相关资源
        最近更新 更多