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.

10voto

user5783745 Points 1214

Voici une méthode très simple, rapide dplyr / tidy solution :

Supprimez les lignes qui sont entièrement identiques :

library(dplyr)
iris %>% 
  distinct(.keep_all = TRUE)

Supprimez les lignes qui ne sont identiques que dans certaines colonnes :

iris %>% 
  distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)

6voto

mpalanco Points 6903

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')

Salida:

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

4voto

vasili111 Points 167

Suppression des lignes en double d'un cadre de données

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe
distinct(mydata)

Dans cet ensemble de données, il n'y a pas une seule ligne en double, donc il a retourné le même nombre de lignes que dans mydata.

Suppression des lignes en double sur la base d'une variable unique

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)

La fonction .keep_all est utilisée pour conserver toutes les autres variables dans le cadre de données de sortie.

Suppression des rangées dupliquées en fonction de plusieurs variables

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)

En .keep_all est utilisée pour conserver toutes les autres variables dans le cadre de données de sortie.

(de : http://www.datasciencemadesimple.com/remove-duplicate-rows-r-using-dplyr-distinct-function/ )

3voto

Joe Points 2572

Ou vous pouvez imbriquer les données des colonnes 4 et 5 dans 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 gardé les données des colonnes 4 et 5 dans un tibble et vous pouvez revenir au cadre de données original à tout moment avec unnest() .

1voto

Ronak Shah Points 24715

Ce problème peut également être résolu en sélectionnant la première ligne de chaque groupe, où le groupe est constitué des colonnes sur lesquelles nous voulons sélectionner les valeurs uniques (dans l'exemple partagé, il s'agit uniquement de la première colonne).

Utilisation de la base R :

subset(df, ave(V2, V1, FUN = seq_along) == 1)

#                      V1  V2 V3     V4 V5
#1 platform_external_dbus 202 16 google  1

Sur dplyr

library(dplyr)
df %>% group_by(V1) %>% slice(1L)

Ou en utilisant data.table

library(data.table)
setDT(df)[, .SD[1L], by = V1]

Si nous avons besoin de trouver des lignes uniques basées sur plusieurs colonnes, il suffit d'ajouter les noms de ces colonnes dans la partie de regroupement pour chacune des réponses ci-dessus.

données

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L), 
.Label = "platform_external_dbus", class = "factor"), 
V2 = c(202L, 202L, 202L, 202L, 202L), V3 = c(16L, 16L, 16L, 
16L, 16L), V4 = structure(c(1L, 4L, 3L, 5L, 2L), .Label = c("google", 
"hughsie", "localhost", "space-ghost.verbum", "users.sourceforge"
), class = "factor"), V5 = c(1L, 1L, 1L, 8L, 1L)), class = "data.frame", 
row.names = c(NA, -5L))

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