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.
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.
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
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
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
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)), ]
X1 X2 X3
1 2 9 6
2 4 6 7
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
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)
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()
.