Преимущественное удаление частичных дубликатов в кадре данных, зависящее от нескольких столбцов - PullRequest
1 голос
/ 20 мая 2019

При удалении строк, которые являются дубликатами в одном конкретном столбце, возможно ли предпочтительно сохранить одну из повторяющихся строк на основе второго и третьего столбцов?

Рассмотрим следующий пример:

# Example dataframe.
df <- data.frame(col.1 = c(1, 1, 1, 2, 2, 2, 3, 3),
                 col.2 = c('a', 'b', 'b', 'a', 'b', 'c', 'a', 'a'),
                 col.3 = c('b', 'c', 'a', 'b', 'a', 'b', 'c', 'b'))
# Output
col.1 col.2 col.3
    1     a     b
    1     b     c
    1     b     a
    2     a     b
    2     b     a
    2     c     b
    3     a     c
    3     a     b

Я хотел бы удалить строки, которые являются дубликатами в col.1, при этом предпочтительно сохраняя строки, которые имеют col.2 == 'b' и col.3 == 'c'.Совпадение в col.2 и col.3 является наиболее предпочтительным, в то время как одиночное совпадение в col.2 предпочтительнее, чем одно совпадение в col.3, а совпадение только в одном столбце предпочтительнее, чем полное отсутствие совпадений.Для повторяющихся строк без совпадений может быть сохранена любая из повторяющихся строк.

В данном примере результирующий кадр данных будет выглядеть следующим образом:

# Output.
col.1 col.2 col.3
    1     b     c
    2     b     a 
    3     a     c

Спасибовы!

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Мы группируем по 'col.1', filter строкам, где 'col.2' - 'b' или 'col.3' - 'c', затем filter из duplicated строк на основе Значения «col.2» и «col.3»

library(tidyverse)
df %>% 
   group_by(col.1) %>% 
   filter(col.2 == 'b'| col.3 == 'c') %>%
   ungroup %>%
   filter(!duplicated(.[-1], fromLast = TRUE))
# A tibble: 3 x 3
#  col.1 col.2 col.3
#  <dbl> <fct> <fct>
#1     1 b     c    
#2     2 b     a    
#3     3 a     c    
0 голосов
/ 21 мая 2019

Если вы group_by col.1 и col.3, при этом преимущественно сохраняются дубликаты, имеющие col.2 == 'b'.Затем вы берете выходные данные этого и group_by просто col.1, сохраняя при этом преимущественно дубликаты, которые имеют col.3 == 'c', в итоге вы получите желаемый результат.Это также следует желаемой логике, если предпочтительные значения изменены.

df %>%
  group_by(col.1, col.3) %>%
  slice(match('b', col.2, nomatch = 1)) %>%
  group_by(col.1) %>%
  slice(match('c', col.3, nomatch = 1))


# Output:
# A tibble: 3 x 3
# Groups:   col.1 [3]
  col.1 col.2 col.3
  <dbl> <fct> <fct>
1     1 b     c    
2     2 b     a    
3     3 a     c  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...