функции dplyr group_by и cummean

Я ожидал, что приведенный ниже код выведет фрейм данных с тремя строками, каждая строка представляет совокупное среднее значение миль на галлон после вычисления среднего значения для каждой группы cyl:

library(dplyr)
mtcars %>%
arrange(cyl) %>%
group_by(cyl) %>%
summarise(running.mean.mpg = cummean(mpg))

Вот чего я ожидал:

mean_cyl_4 <- mtcars %>% 
filter(cyl == 4) %>%
summarise(mean(mpg))

mean_cyldplyr6 <- mtcars %>% 
filter(cyl == 4 | cyl == 6) %>%
summarise(mean(mpg))

mean_cyldplyr6_8 <- mtcars %>% 
filter(cyl == 4 | cyl == 6 | cyl == 8) %>%
summarise(mean(mpg))

data.frame(cyl = c(4,6,8), running.mean.mpg = c(mean_cyl_4[1,1], mean_cyldplyr6[1,1], mean_cyldplyr6_8[1,1]))

  cyl running.mean.mpg
1   4     26.66364
2   6     23.97222
3   8     20.09062

Почему dplyr игнорирует group_by(cyl)?


person luciano    schedule 19.04.2014    source источник


Ответы (3)


require("dplyr")

mtcars %>%
  arrange(cyl) %>%
  group_by(cyl) %>%
  mutate(running.mean.mpg = cummean(mpg)) %>%
  select(cyl, running.mean.mpg)

# Source: local data frame [32 x 2]
# Groups: cyl
# 
# # cyl running.mean.mpg
# # 1    4         22.80000
# # 2    4         23.60000
# # 3    4         23.33333
# # 4    4         25.60000
# # 5    4         26.56000
# # 6    4         27.78333
# # 7    4         26.88571
# # 8    4         26.93750

Ради экспериментов, это также будет работать с data.table. Я имею в виду, что вам нужно загрузить dplyr, чтобы было доступно cummean().

require("data.table")
DT <- as.data.table(mtcars)
DT[,j=list(
  running.mean.mpg = cummean(mpg)
  ), by="cyl"]
person marbel    schedule 19.04.2014
comment
Мартин, это все еще не то, что я ожидал. См. Мое редактирование, в котором показан data.frame, который, как я ожидал, будет выведен. - person luciano; 20.04.2014
comment
Что ж, похоже, вы не понимаете, что group_by должен делать. Он группируется на основе переменной. Сейчас вы запрашиваете результат (среднее значение), основанный на различных условиях фильтрации. Вот почему cummean и group_by не работают, они нужны для чего-то другого. - person marbel; 20.04.2014

Используйте mutate вместо summarise.

person G. Grothendieck    schedule 19.04.2014

Это работает так, как вы хотите.

mtcars %>%
arrange(cyl) %>%
mutate(running.mean.mpg = cummean(mpg)) %>%
select(cyl, running.mean.mpg)%>%
group_by(cyl)%>%
summarize(target=last(running.mean.mpg))
person UnlimitedChili    schedule 03.11.2016