Я просмотрел дубликаты ответов, но не смог найти аналогичный случай. Я хочу удалить дубликаты только для одной группы и оставить все как есть. Можно ли этого добиться без создания временной таблицы?
Пример:
Я хочу удалить дубликаты только для 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" и не трогать другие идентификаторы. Можно ли этого добиться без создания временной таблицы?
Мой текущий рабочий процесс
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
Вы можете использовать отрицательное подмножество, запрашивающее дублирование для 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
Может i <- which(dt$ID == "B"); dt[-i[duplicated(dt[i,c("VAL", "VAL2")])],]
приходит к тому, что вы хотели?
Это, конечно, можно сделать так же, как вы уже сделали:
dt %>%
filter(ID == "B") %>%
distinct(VAL, VAL2, .keep_all = T) %>%
bind_rows(dt %>% filter(ID != "B"))
Это также может быть достигнуто с помощью data.table
:
library(data.table)
setDT(dt)
dt[ID != "B" | !duplicated(dt, by=c("ID", "VAL", "VAL2"))]
ааа, я плохо формулирую вопрос. Это не единственные мои поля, и есть несколько других, поэтому мне нужно уникальность именно по этим двум полям. Извинения. Я переформатирую вопрос.