Come posso estrarre in modo efficiente colonne costanti per gruppo da un frame di dati? Di seguito ho incluso un'implementazione plyr per rendere preciso ciò che sto cercando di fare, ma è lento. Come posso farlo nel modo più efficiente possibile? (Idealmente senza dividere il frame di dati).Individuare in modo efficiente le colonne della costante di gruppo in 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)
Nel mio caso reale utilizzo (profondità ggplot2) vi può essere un numero arbitrario di colonne costanti e non costanti. La dimensione dei dati nell'esempio riguarda il giusto ordine di grandezza.
si sta già facendo meglio di qualsiasi implementazione pure-R utilizzando plyr. IMHO si può fare solo meglio ordinando il df per gruppo (abbastanza velocemente) e poi scansionando per le interruzioni nel codice C. –
@Simon Sto facendo meglio di qualsiasi soluzione basata su riga con plyr - Mi sento come se ci dovesse essere una soluzione basata su astuzia basata su colonne. – hadley