2010-05-24 28 views
20

decir que tengo una trama de datos DF con dos o más columnas, hay una manera fácil de usar único() u otra función R para crear un subconjunto de combinaciones únicas de dos o más columnas?R equivalente a SELECT DISTINCT en dos o más campos/variables

Sé que puedo usar sqldf() y escribir una consulta fácil "SELECT DISTINCT var1, var2, ... varN", pero estoy buscando una forma R de hacerlo.

Se me ocurrió probar ftable coaccionado a una trama de datos y el uso de los nombres de campo, pero también obtener las tabulaciones cruzadas de combinaciones que no existen en el conjunto de datos:

uniques <- as.data.frame(ftable(df$var1, df$var2)) 

Respuesta

34

unique trabaja en data.frame entonces unique(df[c("var1","var2")]) debería ser lo que quieras.

Otra opción es distinct de dplyr package:

df %>% select(var1, var2) %>% distinct 

(o más viejas manera distinct(select(df, var1, var2))).

-2

para mantener todas las demás variables en uso df esto:

unique_rows <- !duplicated(df[c("var1","var2")]) 

unique.df <- df[unique_rows,] 

Otro método menos recomendable es el uso de row.names() # (véase el comentario de David abajo):

unique_rows <- row.names(unique(df[c("var1","var2")])) 

unique.df <- df[unique_rows,] 
+2

Nº de funcionamiento sobre la fila nombres es siempre una mala idea. Simplemente use 'duplicated' si quiere un vector booleano. –

+0

no estoy seguro de por qué ha sido votado :) – sbaniwal

+0

Porque ha editado su respuesta sin agregar ninguna nota/contribución. Entonces nadie sabía que realmente arreglaste tu respuesta. –

0

@ respuesta de Marek obviamente es correcto, pero puede estar desactualizado. La versión actual (0.7.4) permite un código aún más simple:

simplemente usar:

df %>% distinct(var1, var2) 

Si desea mantener todas las columnas, añadir

df %>% distinct(var1, var2, .keep_all = TRUE) 
Cuestiones relacionadas