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" и не трогать другие идентификаторы. Можно ли этого добиться без создания временной таблицы?

Мой текущий рабочий процесс

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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
56
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

ааа, я плохо формулирую вопрос. Это не единственные мои поля, и есть несколько других, поэтому мне нужно уникальность именно по этим двум полям. Извинения. Я переформатирую вопрос.

Hakki 14.12.2020 11:53

Может i <- which(dt$ID == "B"); dt[-i[duplicated(dt[i,c("VAL", "VAL2")])],] приходит к тому, что вы хотели?

GKi 14.12.2020 12:10
Ответ принят как подходящий

Это, конечно, можно сделать так же, как вы уже сделали:

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

Другие вопросы по теме