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

时间:2019-07-15 18:10:10

标签: r dataframe unique distinct flags

我想基于对某些行的重复观察来唯一地标记数据集(df)。例如:

-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}

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


 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

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


 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

但这仅不会标记重复的列。

非常感谢您!

2 个答案:

答案 0 :(得分:0)

一种使用基数R的可能方法,其中,我们(1)使用IDduplicated过滤另外的unique来过滤唯一的重复行(不考虑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")

答案 1 :(得分:0)

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