Удалить дубликаты строк на основе нескольких столбцов, используя dplyr / tidyverse? - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы удалить повторяющиеся строки на основе> 1 столбца, используя dplyr / tidyverse

Пример

library(dplyr)

df <- data.frame(a=c(1,1,1,2,2,2), b=c(1,2,1,2,1,2), stringsAsFactors = F)

Я думал, что это вернет строки 3 и 6, но возвращает 0 строк ,

df %>% filter(duplicated(a, b))
# [1] a b
# <0 rows> (or 0-length row.names)

И наоборот, я думал, что это вернет строки 1,2,4 и 5, но возвращает все строки.

df %>% filter(!duplicated(a, b))
#   a b
# 1 1 1
# 2 1 2
# 3 1 1
# 4 2 2
# 5 2 1
# 6 2 2

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Использование unique в кадре данных дает уникальные строки.

unique(df)

#  a b
#1 1 1
#2 1 2
#4 2 2
#5 2 1

В качестве альтернативы может быть выбран аккуратный выбор 1-го ряда каждой группы.

library(dplyr)

df %>% group_by(a, b) %>% slice(1L) 
#If only 2 columns
#df %>% group_by_all() %>%slice(1L)

#      a     b
#  <dbl> <dbl>
#1     1     1
#2     1     2
#3     2     1
#4     2     2

Обратное будет:

df %>%  group_by(a, b) %>% filter(n() > 1) %>%  distinct()
#If only 2 columns
#df %>%  group_by_all() %>% filter(n() > 1) %>%  distinct()

#     a     b
#  <dbl> <dbl>
#1     1     1
#2     2     2
2 голосов
/ 26 марта 2020

duplicated ожидается, что будет работать "вектор или фрейм данных или массив" (но не два вектора ... он ищет Дублирование только в первом аргументе) глагол dplyr для этого может быть distinct:

df %>%
  distinct(a, b, .keep_all = TRUE)
#   a b
# 1 1 1
# 2 1 2
# 3 2 2
# 4 2 1

, хотя я не знаю, что он имеет обратную функцию.

...