首页 > 解决方案 > R 仅删除一组重复项

问题描述

我查看了重复的答案,但找不到与此类似的案例。我只想删除一组的重复项并保持原样。这可以在不创建临时表的情况下实现吗?

例子:

我只想删除 ID == "B" 的重复项,我不在乎其他 ID 中是否有重复项。

library(dplyr)

dt <- tibble(ID = rep(LETTERS[1:3], 3),
       VAL = rep(1:3, 3),
       VAL2 = rep(1:3, 3)) %>% 
  arrange(ID)

我通常用来在两列中查找重复项。

dt %>% 
  group_by(ID) %>% 
  distinct(VAL, VAL2, .keep_all = T)

这当然会找到所有重复项,我可以使用过滤器并创建一个新表,然后从那里开始工作,但是寻找删除 ID == "B" 重复项而不触及其他 ID 的方法。这可以在不创建临时表的情况下实现吗?

我目前的工作流程

B <- dt %>% 
  filter(ID == "B") %>% 
  distinct(VAL, VAL2, .keep_all = T)


dt %>% 
  filter(ID != "B") %>% 
  bind_rows(B)

# A tibble: 7 x 3
  ID      VAL  VAL2
  <chr> <int> <int>
1 A         1     1
2 A         1     1
3 A         1     1
4 C         3     3
5 C         3     3
6 C         3     3
7 B         2     2

标签: rduplicates

解决方案


您可以使用负子集来要求重复 for ID=="B"

i <- which(dt$ID == "B")
dt[-i[duplicated(dt[i,])],]
#dt[-i[duplicated(dt[i,c("VAL", "VAL2")])],] #Alternative limiting to VAL and VAL2
#  ID      VAL  VAL2
#  <chr> <int> <int>
#1 A         1     1
#2 A         1     1
#3 A         1     1
#4 B         2     2
#5 C         3     3
#6 C         3     3
#7 C         3     3

或者您可以rbind在子设置后dt使用unique并在选定的行上使用。

i <- dt$ID == "B"
rbind(dt[!i,], unique(dt[i,]))
#  ID      VAL  VAL2
#  <chr> <int> <int>
#1 A         1     1
#2 A         1     1
#3 A         1     1
#4 C         3     3
#5 C         3     3
#6 C         3     3
#7 B         2     2

推荐阅读