如何唯一标记 R 中的重复行?

How to uniquely flag duplicate rows in R?

我想尝试根据对某些行的重复观察来唯一标记数据集 (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)]

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

非常感谢!

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

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")

这是 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