Найти дублированные строки (на основе 2 столбцов) в Data Frame в R

У меня есть кадр данных в R, который выглядит так:

| RIC    | Date                | Open   |
|--------|---------------------|--------|
| S1A.PA | 2011-06-30 20:00:00 | 23.7   |
| ABC.PA | 2011-07-03 20:00:00 | 24.31  |
| EFG.PA | 2011-07-04 20:00:00 | 24.495 |
| S1A.PA | 2011-07-05 20:00:00 | 24.23  |

Я хочу знать, есть ли дубликаты относительно комбинации RIC и Date. Существует ли для этого функция для R?

Ответ 1

Вы всегда можете попробовать просто передать эти первые два столбца функции duplicated:

duplicated(dat[,1:2])

Предполагая, что ваш фрейм данных называется dat. Для получения дополнительной информации мы можем обратиться к файлам справки для функции duplicated, набрав ?duplicated на консоли. Это предоставит следующие предложения:

Определяет, какие элементы вектора или фрейма данных являются дубликатами элементы с меньшими индексами и возвращает логический вектор указывая, какие элементы (строки) дублируются.

Итак, duplicated возвращает логический вектор, который затем можно использовать для извлечения подмножества dat:

ind <- duplicated(dat[,1:2])
dat[ind,]

или вы можете пропустить отдельный шаг назначения и просто использовать:

dat[duplicated(dat[,1:2]),]

Ответ 2

dplyr настолько хорош для такого рода вещей:

library(dplyr)
yourDataFrame %>%
    distinct(RIC, Date, .keep_all = TRUE)

( ".keep_all" является необязательным, если он не используется, он будет возвращать только деблокированные 2 столбца. Когда он используется, он возвращает выделенный полный фрейм данных)

Ответ 3

Я думаю, что то, что вы ищете, - это способ вернуть кадр данных дублированных строк в том же формате, что и исходные данные. Возможно, это более элегантный способ сделать это, но это работает:

dup <- data.frame(as.numeric(duplicated(df$var))) #creates df with binary var for duplicated rows
colnames(dup) <- c("dup") #renames column for simplicity
df2 <- cbind(df, dup) #bind to original df
df3 <- subset(df2, dup == 1) #subsets df using binary var for duplicated`

Ответ 4

Если вы хотите удалить дубликаты записей на основе значений столбцов Дата и Состояние в наборе данных data.frame:

#Indexes of the duplicate rows that will be removed: 
duplicate_indexes <- which(duplicated(dataset[c('Date', 'State')]),) 
duplicate_indexes 

#new_uniq will contain unique dataset without the duplicates. 
new_uniq <- dataset[!duplicated(dataset[c('Date', 'State')]),] 
View(new_uniq)