Найти индексы дублированных строк [дубликат]


этот вопрос уже есть ответ здесь:

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

функция, дублированная в R, выполняет поиск повторяющихся строк. Если мы хотим удалить дубликаты, нам нужно просто написать df[!duplicated(df),] и дубликаты будут удалены из фрейма данных.

но как найти индексы дублированных данных? Если duplicated возвращает TRUE для некоторой строки, это означает, что это второе появление такой строки во фрейме данных и ее индекс может быть легко получен. Как получить индекс первого появления этой строки? Или, другими словами, индекс, с которым дублированная строка идентична?

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

2 58

2 ответа:

это возвращает логический вектор индекса:

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]

вот пример:

df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])
#[1]  1  2  4  5  8  9 10

обновление (исходя из комментария):
Сложность команды может быть уменьшена, если fromLast = TRUE используется в качестве аргумента функции. Это проще, чем создание двух обратных векторов.

duplicated(df) | duplicated(df, fromLast = TRUE)

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

как это работает?

функции duplicated применяется как к исходному фрейму данных, так и к фрейму данных с обратным порядком строк. Выход последнее снова меняется на противоположное. Обратите внимание, что первые вхождения повторяющихся значений в исходных данных являются последними вхождениями в перевернутой версии. После этого оба вектора объединяются с помощью | С a TRUE по крайней мере в одном из них указывается Дублированное значение.

если вы используете ключом данные.таблица, то вы можете использовать следующий элегантный синтаксис

library(data.table)
DT <- data.table(A = rep(1:3, each=4), 
                 B = rep(1:4, each=3), 
                 C = rep(1:2, 6), key = "A,B,C")

DT[unique(DT[duplicated(DT)]),which=T]

распаковать

  • DT[duplicated(DT)] подмножества те строки, которые являются дубликатами.

  • unique(...) возвращает только уникальные комбинации повторяющихся строк. Это касается любых случаев с более чем 1 дубликат (дубликат дубликаты например трехкратной повторности и т. д.)

  • DT[..., which = T] сливает дублировать строки с оригиналом, с which=T возврат номера строки (без which = T он просто вернет данные).

вы также можете использовать

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]