web-dev-qa-db-fra.com

Rechercher des lignes dupliquées (basées sur 2 colonnes) dans la trame de données dans R

J'ai une trame de données dans R qui ressemble à:

| 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  |

Je veux savoir s'il y a des doublons concernant la combinaison de RIC et Date. Y a-t-il une fonction pour cela dans R?

28
user802231

Vous pouvez toujours essayer de simplement passer ces deux premières colonnes à la fonction duplicated:

duplicated(dat[,1:2])

en supposant que votre bloc de données s'appelle dat. Pour plus d'informations, nous pouvons consulter les fichiers d'aide de la fonction duplicated en tapant ?duplicated sur la console. Cela fournira les phrases suivantes:

Détermine quels éléments d'un vecteur ou d'une trame de données sont des doublons d'éléments avec des indices plus petits et renvoie un vecteur logique indiquant quels éléments (lignes) sont des doublons.

Donc duplicated renvoie un vecteur logique, que nous pouvons ensuite utiliser pour extraire un sous-ensemble de dat:

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

ou vous pouvez ignorer l'étape d'affectation distincte et simplement utiliser:

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

dplyr est tellement plus agréable pour ce genre de chose:

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

(le ".keep_all est facultatif. s'il n'est pas utilisé, il ne renverra que les 2 colonnes dédoublées. lorsqu'il est utilisé, il renvoie la trame de données entière dédoublée)

10
Guy Manova

Si vous souhaitez supprimer les enregistrements en double en fonction des valeurs des colonnes Date et State in dataset 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) 
3
Saurabh Jain

Je pense que ce que vous recherchez est un moyen de renvoyer un bloc de données des lignes dupliquées dans le même format que vos données d'origine. Il existe probablement une façon plus élégante de le faire, mais cela fonctionne:

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`
2
Peter Geissert

Voici une option dplyr pour baliser les doublons sur la base de deux (ou plus) colonnes. Dans ce cas ric et 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 
0
sbha