Porting establece operaciones de los marcos de datos de R a tablas de datos: ¿Cómo identificar filas duplicadas?

StackOverflow https://stackoverflow.com/questions/7822138

Pregunta

Actualización 1: Como señaló Matthew Dowle, estoy usando data.table Versión 1.6.7 en R-Forge, no Cran. No verá el mismo comportamiento con una versión anterior de data.table.]

Como fondo: estoy portando algunas pequeñas funciones de utilidad para establecer operaciones en filas de un marco de datos o pares de marcos de datos (es decir, cada fila es un elemento en un conjunto), por ejemplo, único: crear un conjunto desde una lista, unión, intersección, diferencia establecida, etc. Estos imitan a Matlab intersect(...,'rows'), setdiff(...,'rows'), etc., que no parecen tener contrapartes en R (las operaciones establecidas de R se limitan a vectores y listas, pero no filas de matrices o marcos de datos). Ejemplos de estas pequeñas funciones están a continuación. Si esta funcionalidad para marcos de datos ya existe en algún paquete o base R, estoy abierto a sugerencias.

He estado migrando estos a tablas de datos y un paso necesario en el enfoque actual es encontrar filas duplicadas. Cuando duplicated() se ejecuta un error se devuelve indicando que las tablas de datos deben tener claves. Este es un obstáculo desafortunado, aparte de establecer claves, que no es una solución universal y se suma a los costos computacionales, ¿hay alguna otra forma de encontrar objetos duplicados?

Aquí hay un ejemplo reproducible:

library(data.table)
set.seed(0)
x   <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
y   <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))

res3    <- dt_intersect(x,y)

Produciendo este mensaje de error:

Error in duplicated.data.table(z_rbind) : data table must have keys

El código funciona como es para marcos de datos, aunque he nombrado cada función con el patrón dt_operation.

¿Hay alguna forma de solucionar este problema? La configuración de las claves solo funciona para enteros, que es una restricción que no puedo asumir para los datos de entrada. Entonces, ¿tal vez me falta una forma inteligente de usar tablas de datos?


Ejemplo establecer funciones de operación, donde los elementos de los conjuntos son filas de datos:

dt_unique       <- function(x){
    return(unique(x))
}

dt_union        <- function(x,y){
    z_rbind     <- rbind(x,y)
    z_unique    <- dt_unique(z_rbind)
    return(z_unique)
}

dt_intersect    <- function(x,y){
    zx          <- dt_unique(x)
    zy          <- dt_unique(y)

    z_rbind     <- rbind(zy,zx)
    ixDupe      <- which(duplicated(z_rbind))
    z           <- z_rbind[ixDupe,]
    return(z)
}

dt_setdiff      <- function(x,y){
    zx          <- dt_unique(x)
    zy          <- dt_unique(y)

    z_rbind     <- rbind(zy,zx)
    ixRangeX    <- (nrow(zy) + 1):nrow(z_rbind)
    ixNotDupe   <- which(!duplicated(z_rbind))
    ixDiff      <- intersect(ixNotDupe, ixRangeX)
    diffX       <- z_rbind[ixDiff,]
    return(diffX)
}

Nota 1: Un uso previsto para estas funciones auxiliares es encontrar filas donde los valores clave en x no están entre los valores clave en y. De esta manera, puedo encontrar dónde puede aparecer Nas al calcular x[y] o y[x]. Aunque este uso permite la configuración de claves para el z_rbind Objeto, preferiría no limitarme a este caso de uso.

Nota 2: Para publicaciones relacionadas, Aquí hay una publicación Sobre correr unique en marcos de datos, con excelentes resultados para ejecutarlo con el actualizado data.table paquete. Y Esta es una publicación anterior Sobre correr unique en tablas de datos.

¿Fue útil?

Solución

duplicated.data.table Necesita la misma solución unique.data.table tengo [editar: ahora hecho en v1.7.2]. Por favor, recaude otro informe de error: bug.report(package="data.table"). En beneficio de que otros observan, ya está usando V1.6.7 de R-Forge, no 1.6.6 en CRAN.

Pero, en la nota 1, hay un idioma 'no unirse':

x[-x[y,which=TRUE]]

Ver también FR#1384 (¿Nuevos argumentos 'no' y 'cuáles'?) Para facilitarlo a los usuarios, y eso se vincula a la claves que no coinciden Hilo que entra en más detalles.


Actualizar. Ahora en V1.8.3, se ha implementado Not-Join.

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top