【问题标题】:How to uniquely flag duplicate rows in R?如何唯一标记R中的重复行?
【发布时间】:2019-07-15 18:10:10
【问题描述】:

我想尝试根据对某些行的重复观察来唯一地标记数据集 (df)。举个例子:


 ID      Name1     Name2      Name3     Name4    Name5
   1       abc       NA         rr       def      NA
   2       AA        NA         NA       NA       NA
   3       abc       NA         rr       def      NA
   5       rty       NA         NA       NA       NA
   6       rty       NA         NA       NA       NA
   7       rty       NA         NA       NA       NA

但我想要一个基于名称 1 到 5 标记相同行并删除唯一行的数据集,如下所示


 ID      Name1     Name2      Name3     Name4    Name5    Flag
   1       abc       NA         rr       def      NA       a
   3       abc       NA         rr       def      NA       a
   5       rty       NA         NA       NA       NA       b
   6       rty       NA         NA       NA       NA       b
   7       rty       NA         NA       NA       NA       b

到目前为止,我已经这样做了:

duplicated(df[c(-1)])|duplicated(df[c(-1)]

但这只是不会标记重复的列。

非常感谢!

【问题讨论】:

    标签: r dataframe unique distinct flags


    【解决方案1】:

    一种使用基础 R 的可能方法,其中我们 (1) 过滤唯一重复行(不考虑 ID),使用 duplicatedunique 添加额外的 Flag 列,以及 (2) 合并在Name 列上将data.frame 过滤回原来的:

    df1 <- unique(df[duplicated(df[, -1]) | duplicated(df[, -1], fromLast = TRUE), -1])
    df1$Flag <- letters[seq_len(nrow(df1))]
    
    merge(df, df1, by = names(df)[-1])
    
    #>   Name1 Name2 Name3 Name4 Name5 ID Flag
    #> 1   abc    NA    rr   def    NA  1    a
    #> 2   abc    NA    rr   def    NA  3    a
    #> 3   rty    NA  <NA>  <NA>    NA  5    b
    #> 4   rty    NA  <NA>  <NA>    NA  6    b
    #> 5   rty    NA  <NA>  <NA>    NA  7    b
    

    数据

    df <- structure(list(ID = c(1L, 2L, 3L, 5L, 6L, 7L), Name1 = c("abc", 
                "AA", "abc", "rty", "rty", "rty"), Name2 = c(NA, NA, NA, NA, 
                NA, NA), Name3 = c("rr", NA, "rr", NA, NA, NA), Name4 = c("def", 
                NA, "def", NA, NA, NA), Name5 = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
            -6L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      这是dplyr 的一种方式-

      df %>% 
        group_by_at(vars(starts_with("Name"))) %>% 
        filter(n() > 1) %>% 
        mutate(Flag = group_indices()) %>% 
        ungroup()
      
      # A tibble: 5 x 7
           ID Name1 Name2 Name3 Name4 Name5  Flag
        <int> <chr> <lgl> <chr> <chr> <lgl> <int>
      1     1 abc   NA    rr    def   NA        1
      2     3 abc   NA    rr    def   NA        1
      3     5 rty   NA    <NA>  <NA>  NA        2
      4     6 rty   NA    <NA>  <NA>  NA        2
      5     7 rty   NA    <NA>  <NA>  NA        2
      

      【讨论】:

      • 我也喜欢这个答案,但是如果变量都不是以名称开头怎么办?我可以这样做:group_by_at(vars( c(我想要的任何变量)))??
      猜你喜欢
      • 2019-03-20
      • 1970-01-01
      • 2020-04-22
      • 2018-05-09
      • 2021-11-10
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多