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?
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]),]
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)
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)
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`
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