data.table
¿Por qué mi antiguo código no funciona?
Buscar..
Introducción
Único y duplicado ya no funciona en datos con clave.
Esto es para aquellos que se mueven a data.table> = 1.9.8
Tienes un conjunto de datos de dueños y nombres de mascotas, pero sospechas que se han capturado algunos datos repetidos.
library(data.table)
DT <- data.table(pet = c("dog","dog","cat","dog"),
owner = c("Alice","Bob","Charlie","Alice"),
entry.date = c("31/12/2015","31/12/2015","14/2/2016","14/2/2016"),
key = "owner")
> tables()
NAME NROW NCOL MB COLS KEY
[1,] DT 4 3 1 pet,owner,entry.date owner
Total: 1MB
Recordar tecleando una tabla lo ordenará. Alice ha sido ingresada dos veces.
> DT
pet owner entry.date
1: dog Alice 31/12/2015
2: dog Alice 14/2/2016
3: dog Bob 31/12/2015
4: cat Charlie 14/2/2016
Supongamos que usó unique
método unique
para deshacerse de los duplicados en sus datos en función de la clave, utilizando la fecha de captura de datos más reciente configurando de Último a VERDADERO.
clean.DT <- unique(DT, fromLast = TRUE)
> tables()
NAME NROW NCOL MB COLS KEY
[1,] clean.DT 3 3 1 pet,owner,entry.date owner
[2,] DT 4 3 1 pet,owner,entry.date owner
Total: 2MB
Alice duplicado ha sido eliminado.
clean.DT <- unique(DT, fromLast = TRUE)
> tables()
NAME NROW NCOL MB COLS KEY
[1,] clean.DT 4 3 1 pet,owner,entry.date owner
[2,] DT 4 3 1 pet,owner,entry.date owner
Esto no funciona. Todavía 4 filas!
Fijar
Utilice el parámetro by=
que ya no utiliza de forma predeterminada su clave, sino todas las columnas.
clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)
Ahora todo está bien.
> clean.DT
pet owner entry.date
1: dog Alice 14/2/2016
2: dog Bob 31/12/2015
3: cat Charlie 14/2/2016
Detalles y corrección provisional
Vea el artículo 1 en las notas de la versión de NOTICIAS para más detalles:
Cambios en v1.9.8 (en CRAN 25 Nov 2016)
POTENCIALMENTE QUE CAMBIAN
- Por defecto, todas las columnas ahora se usan con los métodos de tabla de datos
unique()
,duplicated()
yuniqueN()
, # 1284 y # 1841. Para restaurar el comportamiento anterior:options(datatable.old.unique.by.key=TRUE)
. En 1 año, esta opción para restaurar el valor predeterminado anterior quedará en desuso con una advertencia. En 2 años se eliminará la opción. Por favor pase explícitamente laby=key(DT)
para mayor claridad. Sólo se ve afectado el código que se basa en el valor predeterminado. 266 paquetes de CRAN y bioconductores que usan data.table se verificaron antes de su lanzamiento. 9 necesarios para cambiar y fueron notificados. Cualquier línea de código sin cobertura de prueba se habrá perdido por estas verificaciones. Cualquier paquete que no esté en CRAN o Bioconductor no fue verificado.
Por lo tanto, puede usar las opciones como una solución temporal hasta que su código esté arreglado.
options(datatable.old.unique.by.key=TRUE)