Среднее по группам и включает в себя предыдущие группы - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть фрейм данных (df, образец которого был создан ниже).Я хочу сгруппировать по group1 и group2 и взять среднее значение.Принимая среднее значение, я хочу включить предыдущие группы в group1.

df = data.frame(group1 = c('a','a','a','a','a','b','b','b','c','c','c'), 
                group2 = c(1,1,2,2,3,1,1,2,1,2,2), 
                values = c(2,3,4,3, 9,3,2,5,6,3,0))

Пример может лучше всего проиллюстрировать: первая и вторая строки принадлежат одной группе, и они в среднем составляют 2,5.Третья и четвертая группа принадлежат к той же группе, и они в среднем 3,5.Но поскольку они также принадлежат группе 1 (а), я хочу, чтобы желаемый результат был 3, как показано ниже.

group1  group2  meanvalues
a          1    2.5
a          2    3
a          3    4.2
b          1    2.5
b          2    3.33
c          1    6
c          2    3

Ниже приведен мой код, но они принимают только среднее значение в каждой группе

df2 <- df %>% group_by(group1, group2) %>% 
  summarize(meanvalues = mean(values))

1 Ответ

0 голосов
/ 10 декабря 2018

Мы можем сделать следующее:

df %>% group_by(group1, group2) %>% summarise(values = sum(values), n = n()) %>% 
  mutate(meanvalues = cumsum(values) / cumsum(n)) %>% select(-values, -n)
# A tibble: 7 x 3
# Groups:   group1 [3]
#   group1 group2 meanvalues
#   <fct>   <dbl>      <dbl>
# 1 a           1       2.5 
# 2 a           2       3   
# 3 a           3       4.2 
# 4 b           1       2.5 
# 5 b           2       3.33
# 6 c           1       6   
# 7 c           2       3  

То, что вы хотите, является кумулятивным сгруппированным средним значением.Теперь это кажется невозможным за один шаг, поэтому сначала я вычисляю сгруппированные суммы и длины групп, а затем и вычисляю совокупное сгруппированное среднее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...