repetidas - Eliminar filas duplicadas utilizando dplyr
eliminar na en r (4)
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
x y z
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]),]
x y z
1 0 1 1
2 1 0 2
4 1 1 4
Estoy buscando específicamente una solución usando el paquete dplyr
.
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)
x y z
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)
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));
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.
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 grupos con una sola fila:
df %>% group_by(x, y) %>% filter(row_number(z) == 1)
## Source: local data frame [3 x 3]
## Groups: x, y
##
## x y z
## 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)