Каков наилучший способ создания нескольких столбцов в summarize(...)
(или, альтернативно, в do(...)
)? Это возникает, если какая-то функция агрегации возвращает более одного значения. Примером такой функции является quantile(...)
.
Например, предположим, что у нас есть следующие данные
library(dplyr)
data.frame(x = runif(1000, min = 0, max = 20)) %>%
mutate(y = rnorm(n(), mean = sin(x))) %>%
group_by(x.category = round(x)) ->
Z
Мы можем легко вычислить (и построить) квантили:
library(ggplot2) # just to display results (not the focus of this question)
Z %>%
summarize(x = mean(x),
y25 = quantile(y, probs = .25),
y50 = quantile(y, probs = .5),
y75 = quantile(y, probs = .75)) %>%
gather(Statistic, y, -x, -x.category) %>%
ggplot(aes(x, y, color = Statistic)) +
geom_line()
Однако приведенный выше код имеет два недостатка: 1) код quantile(...)
должен дублироваться (это станет более утомительным, если, скажем, понадобится дюжина квантилей), и 2) имена столбцов (y25, y50, y75) может не соответствовать фактическим квантилям.
Эти проблемы можно исправить, используя способность quantile(...)
вычислять несколько квантилей и возвращать их в векторе с именами следующим образом:
Z %>%
do(as_data_frame(c(x = mean(.$x),
as.list(quantile(.$y, probs = c(.25,.5,.75)))))) %>%
gather(Statistic, y, -x, -x.category) %>%
ggplot(aes(x, y, color = Statistic)) +
geom_line()
Однако приведенный выше код кажется мне безобразным; в частности это требует as.list(...)
, c(...)
, as_data_frame(...)
и do(...)
, чтобы сделать что-то довольно простое.
Есть ли лучший способ?