Найти дублированные строки (на основе 2 столбцов) в фрейме данных в R - PullRequest
21 голосов
/ 08 августа 2011

У меня есть фрейм данных в 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?

Ответы [ 5 ]

40 голосов
/ 08 августа 2011

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

duplicated(dat[,1:2])

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

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

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

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

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

dat[duplicated(dat[,1:2]),]
9 голосов
/ 17 июля 2017

dplyr намного лучше для такого рода вещей:

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

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

3 голосов
/ 01 ноября 2017

Если вы хотите удалить дубликаты записей на основе значений столбцов Дата и Состояние в Набор данных 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) 
2 голосов
/ 20 апреля 2012

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

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`
0 голосов
/ 19 марта 2019

Вот опция dplyr для пометки дубликатов на основе двух (или более) столбцов.В этом случае ric и date:

df <- data_frame(ric = c('S1A.PA', 'ABC.PA', 'EFG.PA', 'S1A.PA', 'ABC.PA', 'EFG.PA'),
                 date = c('2011-06-30 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00', '2011-07-05 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00'),
                 open = c(23.7, 24.31, 24.495, 24.23, 24.31, 24.495))

df %>% 
  group_by(ric, date) %>% 
  mutate(dupe = n()>1)
# A tibble: 6 x 4
# Groups:   ric, date [4]
  ric    date                 open dupe 
  <chr>  <chr>               <dbl> <lgl>
1 S1A.PA 2011-06-30 20:00:00  23.7 FALSE
2 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
3 EFG.PA 2011-07-04 20:00:00  24.5 TRUE 
4 S1A.PA 2011-07-05 20:00:00  24.2 FALSE
5 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
6 EFG.PA 2011-07-04 20:00:00  24.5 TRUE 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...