Как эффективно извлечь групповые постоянные столбцы из фрейма данных? Я включил реализацию plyr ниже, чтобы уточнить, что я пытаюсь сделать, но это медленно. Как я могу сделать это как можно эффективнее? (В идеале вообще без разбиения фрейма данных).
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)
В моем реальном случае использования (глубоко внутри ggplot2) может быть произвольное количество постоянных и непостоянных столбцов. Размер данных в примере примерно соответствует порядку величины.