Эффективное нахождение групповых постоянных столбцов в data.frame

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

7
задан Matt Dowle 28 March 2013 в 00:48
поделиться