Поиск всех повторяющихся строк, включая "элементы с меньшими индексами",
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
Преимущество этих подходов заключается в том, что вы можете указать, сколько дубликатов будет вырезано.