Вот базовое решение на случай, если это ваше варенье. Сначала я определяю фрейм данных.
# Original data frame
d <- data.frame(date = c("2017-02-23", "2017-02-22", "2017-02-23", "2017-02-23","2018-02-22", "2018-02-22"),
var1 = c(1,3,6,7,8,5),
var2 = c(1,3,18,15,25,5))
Далее я определяю функцию, которая вычисляет квантили и привязывает их к исходным данным.
# Function to calculate quantiles
foo <- function(x){
q <- quantile(x, prob = c(0.25, 0.75), na.rm = TRUE)
data.frame(x, q25 = q[1], q75 = q[2], row.names = NULL)
}
Я применяю функцию к каждой переменной для каждой даты, затем rbind
результаты в одном кадре данных.
# The horror...
d2 <- do.call(rbind, lapply(levels(d$date),
function(x) data.frame(date = x, lapply(d[d$date == x, names(d) != "date"], foo))))
Это дает следующее.
# print results
d2
#> date var1.x var1.q25 var1.q75 var2.x var2.q25 var2.q75
#> 1 2017-02-22 3 3.00 3.00 3 3 3.0
#> 2 2017-02-23 1 3.50 6.50 1 8 16.5
#> 3 2017-02-23 6 3.50 6.50 18 8 16.5
#> 4 2017-02-23 7 3.50 6.50 15 8 16.5
#> 5 2018-02-22 8 5.75 7.25 25 10 20.0
#> 6 2018-02-22 5 5.75 7.25 5 10 20.0
Создано в 2019-05-29 пакетом представ. (v0.3.0)
Проблема с этим подходом, в отличие от (лучших) решений @ akrun, заключается в том, что он переупорядочивает ваш фрейм данных.