【问题标题】:Delete rows with equal and consecutive values [duplicate]删除具有相等和连续值的行[重复]
【发布时间】:2020-01-08 11:43:56
【问题描述】:

考虑一下这张表

var1    var2        var3
565 P0049129/21     146
565 P0020151/04     146

我想查看此表,找到 var3 等于相同值(本例中为 146)的连续行并删除其中一行。

请注意,在此表中还有其他行 var3=146,我想保留这些行。我只想在 var3 在两个连续行上具有相同值时删除重复。

谢谢

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    我们可以使用rleid,然后使用duplicated。

    df[!duplicated(data.table::rleid(df$var3)), ]
    

    这将只保留第一行连续值并删除其余的。

    【讨论】:

      【解决方案2】:
      library(data.table)
      setDT(df)
      
      df[rowid(rleid(var3)) == 1]
      

      【讨论】:

        【解决方案3】:

        我们可以使用rleid 来查找相同的组

        library(data.table)
        i1 <- setDT(df1)[,  .I[1],rleid(var3)]$V1
        df1[i1]
        #     var1        var2 var3
        #@1:  565 P0049129/21  146
        

        或者另一种选择是

        library(dplyr)
        df1 %>%
           group_by(grp = cumsum(var3 != lag(var3, default = first(var3)))) %>%
           slice(1) %>%
           ungroup %>%
           select(-grp)
        # A tibble: 1 x 3
        #   var1 var2   var3
        #  <int> <chr>       <int>
        #1   565 P0049129/21   146
        

        或者我们可以这样做。base R

        grp <- with(rle(df$var3), rep(seq_along(values), lengths))
        subset(df, !duplicated(grp))
        

        数据

        df <- structure(list(var1 = c(565L, 565L), var2 = c("P0049129/21", 
        "P0020151/04"), var3 = c(146L, 146L)), class = "data.frame", row.names = c(NA, 
        -2L))
        

        【讨论】:

          猜你喜欢
          • 2017-03-02
          • 2011-08-09
          • 2018-12-01
          • 2022-01-12
          • 2023-01-02
          • 1970-01-01
          • 1970-01-01
          • 2017-09-20
          相关资源
          最近更新 更多