Rimuovi le righe duplicate usando dplyr

Ho un data.frame come questo –

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 

Vorrei rimuovere le righe duplicate in base alle prime due colonne. Uscita prevista –

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

Sto cercando specificamente una soluzione usando il pacchetto dplyr .

Nota : dplyr ora contiene la funzione distinct per questo scopo.

Risposta originale qui sotto:


 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 ) 

Un approccio sarebbe raggruppare e quindi mantenere solo la prima riga:

 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 

(In dplyr 0.2 non avrai bisogno della variabile dummy z e sarai solo in grado di scrivere row_number() == 1 )

Ho anche pensato di aggiungere una funzione slice() che avrebbe funzionato come:

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

O forse una variante di unique() che ti consente di selezionare quali variabili utilizzare:

 df %>% unique(x, y) 

Ecco una soluzione che utilizza 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 

Aggiornato per dplyr 0.5

dplyr versione 0.5 comportamento predefinito di distinct() restituisce solo le colonne specificate in argomento.

Per ottenere il risultato originale, ora devi utilizzare:

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

Per completezza, il seguente funziona anche:

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

Tuttavia, preferisco che la soluzione sia distinct e sospetto che sia anche più veloce.

Quando si selezionano le colonne in R per un set di dati ridotto, è spesso ansible trovare duplicati.

Queste due linee danno lo stesso risultato. Ciascuno produce un set di dati univoco con solo due colonne selezionate:

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