web-dev-qa-db-fra.com

Supprimer les lignes dupliquées

J'ai lu un fichier CSV dans un R data.frame. Certaines des lignes ont le même élément dans l'une des colonnes. Je voudrais supprimer les lignes qui sont en double 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 voudrais seulement une de ces lignes car les autres ont les mêmes données dans la première colonne.

129
user1897691

isolez simplement votre cadre de données avec les 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.
155
Anthony Damico

Pour les personnes qui sont venues ici pour chercher une réponse générale à la suppression des lignes en double, utilisez !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 en double du cadre de données R

168
Mehdi Nellen

La fonction distinct() du package dplyr effectue la suppression des doublons arbitraires, permettant ainsi de spécifier les variables dupliquées (comme dans cette question) ou de prendre en compte toutes les variables.

Données:

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

Supprime les lignes dans lesquelles les colonnes spécifiées sont dupliquées:

library(dplyr)
dat %>% distinct(a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

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

dat %>% distinct

  a b
1 1 A
2 2 B
3 1 C
4 2 D
65
Sam Firke

Le paquetage data.table contient également les méthodes unique et duplicated, avec quelques fonctionnalités supplémentaires.

Les méthodes unique.data.table et duplicated.data.table ont un argument supplémentaire by qui permet de transmettre un vecteur character ou integer des noms de colonne ou de leurs emplacements.

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 performances énorme pour des ensembles de données plus volumineux.

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 
25
David Arenburg

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
6
Amit Gupta

Avec sqldf:

# Example by Mehdi Nellen
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)

Solution:

 library(sqldf)
    sqldf('SELECT DISTINCT * FROM df')

Sortie:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2
5
mpalanco

Vous pouvez également utiliser la fonction distinct() de dplyr! Cela a tendance à être plus efficace que les options alternatives, en particulier si vous avez des tonnes d'observations.

distinct_data <- dplyr::distinct(yourdata)
5

Vous pouvez également imbriquer les données des colonnes 4 et 5 sur une seule ligne avec tidyr:

library(tidyr)
df %>% nest(V4:V5)

# A tibble: 1 × 4
#                      V1    V2    V3             data
#                  <fctr> <int> <int>           <list>
#1 platform_external_dbus   202    16 <tibble [5 × 2]>

Les doublons des colonnes 2 et 3 sont maintenant supprimés pour l'analyse statistique, mais vous avez conservé les données des colonnes 4 et 5 dans un tibble et pouvez revenir au bloc de données d'origine à tout moment avec unnest().

3
Joe