Supprimer les lignes dupliquées à l’aide de dplyr

J’ai un data.frame comme ça –

set.seed(123) df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10) > df xyz 1 0 1 1 2 1 0 2 3 0 1 3 4 1 1 4 5 1 0 5 6 0 1 6 7 1 0 7 8 1 0 8 9 1 0 9 10 0 1 10 

Je voudrais supprimer les lignes en double en fonction des deux premières colonnes. Production attendue –

 df[!duplicated(df[,1:2]),] xyz 1 0 1 1 2 1 0 2 4 1 1 4 

Je recherche spécifiquement une solution utilisant le package dplyr .

Remarque : dplyr contient désormais la fonction distinct à cet effet.

Réponse originale ci-dessous:


 library(dplyr) set.seed(123) df <- data.frame( x = sample(0:1, 10, replace = T), y = sample(0:1, 10, replace = T), z = 1:10 ) 

Une approche serait de regrouper, puis de ne conserver que la première ligne:

 df %>% group_by(x, y) %>% filter(row_number(z) == 1) ## Source: local data frame [3 x 3] ## Groups: x, y ## ## xyz ## 1 0 1 1 ## 2 1 0 2 ## 3 1 1 4 

(Dans dplyr 0.2, vous n'aurez pas besoin de la variable z factice et vous pourrez simplement écrire row_number() == 1 )

J'ai aussi pensé à append une fonction slice() qui fonctionnerait comme:

 df %>% group_by(x, y) %>% slice(from = 1, to = 1) 

Ou peut-être une variante de unique() qui vous permettrait de sélectionner les variables à utiliser:

 df %>% unique(x, y) 

Voici une solution utilisant dplyr 0.3 .

 library(dplyr) set.seed(123) df <- data.frame( x = sample(0:1, 10, replace = T), y = sample(0:1, 10, replace = T), z = 1:10 ) > df %>% distinct(x, y) xyz 1 0 1 1 2 1 0 2 3 1 1 4 

Mis à jour pour dplyr 0.5

Le comportement par défaut de dplyr version 0.5 de distinct() ne renvoie que les colonnes spécifiées dans l’argument ...

Pour obtenir le résultat original, vous devez maintenant utiliser:

 df %>% distinct(x, y, .keep_all = TRUE) 

Pour être complet, ce qui suit fonctionne également:

 df %>% group_by(x) %>% filter (! duplicated(y)) 

Cependant, je préfère la solution utilisant distinct , et je pense que c’est plus rapide aussi.

Lorsque vous sélectionnez des colonnes dans R pour un dataset réduit, vous pouvez souvent vous retrouver avec des doublons.

Ces deux lignes donnent le même résultat. Chacun génère un dataset unique avec deux colonnes sélectionnées uniquement:

 distinct(mtcars, cyl, hp); summarise(group_by(mtcars, cyl, hp));