Поиск ВСЕХ дублирующих строк, включая «элементы с меньшими индексами» - PullRequest
92 голосов
/ 21 октября 2011

R's duplicated возвращает вектор, показывающий, является ли каждый элемент вектора или фрейма данных дубликатом элемента с меньшим индексом.Поэтому, если строки 3, 4 и 5 фрейма данных из 5 строк одинаковы, duplicated даст мне вектор

FALSE, FALSE, FALSE, TRUE, TRUE

Но в этом случае я действительно хочу получить

FALSE, FALSE, TRUE, TRUE, TRUE

то есть я хочу знать, дублируется ли строка строкой с индексом больше тоже.

Ответы [ 5 ]

107 голосов
/ 21 октября 2011

duplicated имеет аргумент fromLast.В разделе «Пример» ?duplicated показано, как его использовать.Просто дважды наберите duplicated, один раз с fromLast=FALSE и один раз с fromLast=TRUE и возьмите строки, в которых либо есть TRUE.


Некоторое позднее Править: Вы не предоставили воспроизводимый примервот иллюстрация, любезно предоставленная @ jbaums

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)]
## [1] "c" "c" "c"
33 голосов
/ 21 октября 2011

Вам необходимо собрать набор значений duplicated, применить unique, а затем проверить с помощью %in%. Как всегда, проблема с образцом оживит этот процесс.

> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
>  vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE  TRUE  TRUE  TRUE
3 голосов
/ 01 июня 2016

У меня был тот же вопрос , и, если я не ошибаюсь, это тоже ответ.

vec[col %in% vec[duplicated(vec$col),]$col]

Не знаю, какой из них быстрее, однако набор данных, который я сейчас использую, недостаточно велик для проведения тестов, которые дают значительные промежутки времени.

1 голос
/ 17 июня 2019

Дублированные строки в кадре данных можно получить с помощью dplyr, выполнив

df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()

Чтобы исключить определенные столбцы, вместо группировки можно использовать group_by_at(vars(-var1, -var2)).

Если на самом деле нужны индексы строк, а не только данные, вы можете сначала добавить их, как в:

df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)
0 голосов
/ 07 июня 2019

Если вас интересует, какие строки дублируются для определенных столбцов, вы можете использовать подход plyr :

ddply(df, .(col1, col2), function(df) if(nrow(df) > 1) df else c())

Добавление переменной count с помощью dplyr :

df %>% add_count(col1, col2) %>% filter(n > 1)  # data frame
df %>% add_count(col1, col2) %>% select(n) > 1  # logical vector

Для дублирующихся строк (с учетом всех столбцов):

df %>% group_by_all %>% add_tally %>% ungroup %>% filter(n > 1)
df %>% group_by_all %>% add_tally %>% ungroup %>% select(n) > 1

Преимущество этих подходов состоит в том, что вы можете указать, сколько дубликатов в качестве обрезки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...