Поиск всех повторяющихся строк, включая "элементы с меньшими индексами",

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

FALSE, FALSE, FALSE, TRUE, TRUE

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

FALSE, FALSE, TRUE, TRUE, TRUE

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

Ответ 1

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"

Ответ 2

Вам нужно собрать набор значений 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

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

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

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

Ответ 4

Дублированные строки в фрейме данных можно получить с помощью 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)

Ответ 5

Если вас интересует, какие строки дублируются для определенных столбцов, вы можете использовать подход 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

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