如何唯一标记 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) 使用 duplicated
和 unique
过滤唯一的重复行(不考虑 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
我想尝试根据对某些行的重复观察来唯一标记数据集 (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) 使用 duplicated
和 unique
过滤唯一的重复行(不考虑 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