218 votes

Supprimer les lignes dupliquées

J'ai lu un CSV dans un data.frame R. Certaines des lignes ont le même élément dans l'une des colonnes. Je voudrais supprimer les lignes qui sont des doublons dans cette colonne. Par exemple :

platform_external_dbus          202           16                     google        1
platform_external_dbus          202           16         space-ghost.verbum        1
platform_external_dbus          202           16                  localhost        1
platform_external_dbus          202           16          users.sourceforge        8
platform_external_dbus          202           16                    hughsie        1

Je ne voudrais qu'une seule de ces lignes puisque les autres ont les mêmes données dans la première colonne.

290voto

Mehdi Nellen Points 484

Pour les personnes qui sont venues ici pour trouver une réponse générale à la suppression des rangées dupliquées, utilisez la méthode suivante !duplicated() :

a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

duplicated(df)
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE

> df[duplicated(df), ]
  a b
2 A 1
6 B 1
8 C 2

> df[!duplicated(df), ]
  a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2

Réponse de : Suppression des lignes dupliquées d'un cadre de données R

230voto

Anthony Damico Points 875

Isolez simplement votre cadre de données aux colonnes dont vous avez besoin, puis utilisez la fonction unique :D

# in the above example, you only need the first three columns
deduped.data <- unique( yourdata[ , 1:3 ] )
# the fourth column no longer 'distinguishes' them, 
# so they're duplicates and thrown out.

118voto

Sam Firke Points 8843

La fonction distinct() en el dplyr effectue une suppression arbitraire des doublons, soit à partir de colonnes/variables spécifiques (comme dans cette question), soit en considérant toutes les colonnes/variables. dplyr fait partie de la tidyverse .

Données et paquet

library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))

Supprimer les lignes dupliquées dans une colonne spécifique (par exemple, la colonne a )

Notez que .keep_all = TRUE conserve toutes les colonnes, sinon seule la colonne a seraient conservés.

distinct(dat, a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

Supprimez les lignes qui sont des doublons complets d'autres lignes :

distinct(dat)

  a b
1 1 A
2 2 B
3 1 C
4 2 D

34voto

David Arenburg Points 14239

En data.table Le paquet a également unique y duplicated des méthodes qui lui sont propres avec quelques fonctionnalités supplémentaires.

Les deux unique.data.table et le duplicated.data.table Les méthodes ont une fonction supplémentaire by qui vous permet de passer un character o integer vecteur des noms de colonnes ou de leurs emplacements respectifs

library(data.table)
DT <- data.table(id = c(1,1,1,2,2,2),
                 val = c(10,20,30,10,20,30))

unique(DT, by = "id")
#    id val
# 1:  1  10
# 2:  2  10

duplicated(DT, by = "id")
# [1] FALSE  TRUE  TRUE FALSE  TRUE  TRUE

Une autre caractéristique importante de ces méthodes est un gain de performance considérable pour les grands ensembles de données.

library(microbenchmark)
library(data.table)
set.seed(123)
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10))
DT <- copy(DF)
setDT(DT)

microbenchmark(unique(DF), unique(DT))
# Unit: microseconds
#       expr       min         lq      mean    median        uq       max neval cld
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18   100   b
# unique(DT)   746.855   776.6145  2201.657   864.932   919.489  55986.88   100  a 

microbenchmark(duplicated(DF), duplicated(DT))
# Unit: microseconds
#           expr       min         lq       mean     median        uq        max neval cld
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170   100   b
# duplicated(DT)   551.982   558.2215   851.0246   639.9795   663.658   5805.243   100  a

16voto

Amit Gupta Points 516

La réponse générale peut être par exemple :

df <-  data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6))))

new_df <- df[-which(duplicated(df)), ]

sortie :

      X1 X2 X3
    1  2  9  6
    2  4  6  7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X