R's duplicated
renvoie un vecteur indiquant si chaque élément d'un vecteur ou d'un bloc de données est un double d'un élément avec un indice plus petit. Donc, si les lignes 3, 4 et 5 d'une trame de données de 5 lignes sont identiques, duplicated
me donnera le vecteur
FALSE, FALSE, FALSE, TRUE, TRUE
Mais dans ce cas, je veux vraiment avoir
FALSE, FALSE, TRUE, TRUE, TRUE
c'est-à-dire que je veux savoir si une ligne est dupliquée par une ligne avec un indice plus grand également.
la source
x <- c(1:9, 7:10, 5:22); y <- c(letters, letters[1:5]); test <- data.frame(x, y); test[duplicated(test$x) | duplicated(test$x, fromLast=TRUE), ]
renvoyé les trois exemplaires de 7, 8 et 9. Pourquoi cela fonctionne-t-il?duplicated(c(1,1,1))
vsduplicated(c(1,1,1,), fromLast = TRUE)
donnec(FALSE,TRUE,TRUE)
etc(TRUE,TRUE,FALSE)
. La valeur moyenne estTRUE
dans les deux cas. La prise|
des deux vecteurs donnec(TRUE,TRUE,TRUE)
.Vous devez assembler l'ensemble de
duplicated
valeurs, appliquerunique
, puis tester avec%in%
. Comme toujours, un exemple de problème rendra ce processus vivant.la source
duplicated
,unique
et%in%
pourrait facilement être généralisée à un dataframe si l'on devait d'abordpaste
chaque ligne avec un caractère de séparation inhabituel. (La réponse acceptée est meilleure.)J'ai eu la même question , et si je ne me trompe pas, c'est aussi une réponse.
Je ne sais pas lequel est le plus rapide, cependant, l'ensemble de données que j'utilise actuellement n'est pas assez grand pour faire des tests qui produisent des intervalles de temps importants.
la source
vec
fois comme vecteur atomique et comme trame de données. Je soupçonne qu'avec une trame de données réelle, cela échouerait.Les lignes dupliquées dans une trame de données peuvent être obtenues
dplyr
en faisantPour exclure certaines colonnes
group_by_at(vars(-var1, -var2))
pourrait être utilisé à la place pour regrouper les données.Si les index de ligne et pas seulement les données sont réellement nécessaires, vous pouvez les ajouter d'abord comme dans:
la source
n()
. N'oubliez pas de dissocier le dataframe résultant.Voici la solution de @Joshua Ulrich en fonction. Ce format vous permet d'utiliser ce code de la même manière que vous utiliseriez duplicated ():
En utilisant le même exemple:
la source
Si vous êtes intéressé par les lignes dupliquées pour certaines colonnes, vous pouvez utiliser une approche plyr :
Ajout d'une variable de comptage avec dplyr :
Pour les lignes en double (en tenant compte de toutes les colonnes):
L'avantage de ces approches est que vous pouvez spécifier le nombre de doublons comme seuil.
la source
J'ai eu un problème similaire mais j'avais besoin d'identifier les lignes dupliquées par des valeurs dans des colonnes spécifiques. J'ai proposé la solution de dplyr suivante :
Le code regroupe les lignes par colonnes spécifiques. Si la longueur d'un groupe est supérieure à 1, le code marque toutes les lignes du groupe comme dupliquées. Une fois que cela est fait, vous pouvez utiliser la
Duplicated
colonne pour le filtrage, etc.la source