Eliminar filas duplicadas utilizando dplyr

Tengo un data.frame como este –

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 

Me gustaría eliminar las filas duplicadas en función de las dos primeras columnas. Rendimiento esperado –

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

Estoy buscando específicamente una solución usando el paquete dplyr .

Nota : dplyr ahora contiene la función distinct para este propósito.

Respuesta original a continuación:


 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 enfoque sería agrupar, y luego solo mantener la primera fila:

 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 

(En dplyr 0.2 no necesitará la variable ficticia z y solo podrá escribir row_number() == 1 )

También he estado pensando en agregar una función slice() que funcionaría así:

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

O tal vez una variación de unique() que le permita seleccionar qué variables usar:

 df %>% unique(x, y) 

Aquí hay una solución usando 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 

Actualizado para dplyr 0.5

dplyr versión 0.5 El comportamiento predeterminado de distinct() devuelve solo columnas especificadas en ... argumento.

Para lograr el resultado original, ahora debe usar:

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

Para mayor completitud, lo siguiente también funciona:

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

Sin embargo, prefiero que la solución sea distinct , y sospecho que también es más rápida.

Cuando selecciona columnas en R para un conjunto de datos reducido, a menudo puede terminar con duplicados.

Estas dos líneas dan el mismo resultado. Cada salida es un conjunto de datos único con dos columnas seleccionadas solamente:

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