¿Cómo puedo extraer eficientemente columnas constantes sabio de un marco de datos? He incluido una implementación de plyr a continuación para precisar lo que estoy tratando de hacer, pero es lento. ¿Cómo puedo hacerlo de la manera más eficiente posible? (Idealmente sin dividir el marco de datos en absoluto).Localizar de manera eficiente las columnas constantes de grupos en un data.frame
base <- data.frame(group = 1:1000, a = sample(1000), b = sample(1000))
df <- data.frame(
base[rep(seq_len(nrow(base)), length = 1e6), ],
c = runif(1e6),
d = runif(1e6)
)
is.constant <- function(x) length(unique(x)) == 1
constant_cols <- function(x) head(Filter(is.constant, x), 1)
system.time(constant <- ddply(df, "group", constant_cols))
# user system elapsed
# 20.531 1.670 22.378
stopifnot(identical(names(constant), c("group", "a", "b")))
stopifnot(nrow(constant) == 1000)
En mi caso de uso real (en el interior de ggplot2) puede haber un número arbitrario de columnas constantes y no constantes. El tamaño de los datos en el ejemplo es sobre el orden correcto de magnitud.
ya lo están haciendo mejor que cualquier aplicación pura-R mediante el uso de plyr. En mi humilde opinión, solo puede hacerlo mejor clasificando el df por grupo (bastante rápido) y luego buscando roturas en el código C. –
@Simon Lo estoy haciendo mejor que cualquier solución basada en filas con plyr. Sin embargo, creo que debería haber una solución basada en una columna astuta. – hadley