Найти индексы дублированных строк [дубликат]
этот вопрос уже есть ответ здесь:
- Поиск всех повторяющихся строк, включая " элементы с меньшими индексами" 3 ответы
функция, дублированная в R, выполняет поиск повторяющихся строк. Если мы хотим удалить дубликаты, нам нужно просто написать df[!duplicated(df),]
и дубликаты будут удалены из фрейма данных.
но как найти индексы дублированных данных? Если duplicated
возвращает TRUE для некоторой строки, это означает, что это второе появление такой строки во фрейме данных и ее индекс может быть легко получен. Как получить индекс первого появления этой строки? Или, другими словами, индекс, с которым дублированная строка идентична?
я мог бы сделать цикл на данных.рама, но я думаю, что есть более элегантный ответ на этот вопрос.
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
применяется как к исходному фрейму данных, так и к фрейму данных с обратным порядком строк. Выход последнее снова меняется на противоположное. Обратите внимание, что первые вхождения повторяющихся значений в исходных данных являются последними вхождениями в перевернутой версии. После этого оба вектора объединяются с помощью|
С aTRUE
по крайней мере в одном из них указывается Дублированное значение.
если вы используете ключом данные.таблица, то вы можете использовать следующий элегантный синтаксис
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]