Extracción de filas únicas de una tabla de datos en R

Estoy migrando desde marcos de datos y matrices a tablas de datos, pero no he encontrado una solución para extraer las filas únicas de una tabla de datos. Supongo que hay algo que me falta sobre la notación [,J] , aunque todavía no he encontrado una respuesta en las preguntas frecuentes y las viñetas introductorias. ¿Cómo puedo extraer las filas únicas, sin volver a convertirlas en marcos de datos?

Aquí hay un ejemplo:

 library(data.table) set.seed(123) a <- matrix(sample(2, 120, replace = TRUE), ncol = 3) a <- as.data.frame(a) b <- as.data.table(a) # Confirm dimensionality dim(a) # 40 3 dim(b) # 40 3 # Unique rows using all columns dim(unique(a)) # 8 3 dim(unique(b)) # 34 3 # Unique rows using only a subset of columns dim(unique(a[,c("V1","V2")])) # 4 2 dim(unique(b[,list(V1,V2)])) # 29 2 

Pregunta relacionada: ¿Este comportamiento es el resultado de que los datos no están clasificados, como uniq con la función uniq Unix?

Antes de data.table v1.9.8, el comportamiento predeterminado del método unique.data.table era usar las claves para determinar las columnas mediante las cuales se deberían devolver las combinaciones únicas. Si la key era NULL (valor predeterminado), uno recuperaría el conjunto de datos original (como en la situación de OP).

A partir de data.table 1.9.8+, el método unique.data.table utiliza todas las columnas de forma predeterminada, lo que es coherente con unique.data.frame en la base R. Para que use las columnas clave, explícitamente pase by = key(DT) en unique (reemplazando DT en la llamada a la clave con el nombre de la tabla de datos).

Por lo tanto, el comportamiento anterior sería algo así como

 library(data.table) v1.9.7- set.seed(123) a <- as.data.frame(matrix(sample(2, 120, replace = TRUE), ncol = 3)) b <- data.table(a, key = names(a)) ## key(b) ## [1] "V1" "V2" "V3" dim(unique(b)) ## [1] 8 3 

Mientras que para data.table v1.9.8 +, solo

 b <- data.table(a) dim(unique(b)) ## [1] 8 3 ## or dim(unique(b, by = key(b)) # in case you have keys you want to use them 

O sin una copia

 setDT(a) dim(unique(a)) ## [1] 8 3 

Como lo menciona Seth, el paquete data.table ha evolucionado y ahora propone funciones optimizadas para esto.

Para todos los que no quieren entrar en la documentación, esta es la forma más rápida y eficiente de la memoria para hacer lo que desee:

 uniqueN(a) 

Y si solo quiere elegir un subconjunto de columnas, puede usar el argumento ‘por’:

uniqueN(a,by = c('V1','V2'))

EDITAR: Como se mencionó en los comentarios, esto solo dará el conteo de filas únicas. Para obtener los valores únicos, use en su lugar únicos:

unique(a)

Y para un subconjunto:

unique(a[c('V1',"V2")], by=c('V1','V2'))