变异子集平均值并添加到所有组 R

Mutate subset average and add to all groups R

我正在尝试为我的数据的特定子集创建平均值,并且我想将这些作为新变量添加到数据的不同子集。

假设我有以下数据:

df <- data.frame(year = rep(c(2010,2012,2017), 6),
                 party = rep(c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 2),
                 left = rep(c(1,1,1,0,0,0,1,1,1),2),
                 area = c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2),
                 pp = c(3,4,5,1,2,6,3,4,2,5,1,1,3,4,5,2,3,0))

看起来像:

year party left area pp
2010     A    1    1  3
2012     A    1    1  4
2017     A    1    1  5
2010     B    0    1  1
2012     B    0    1  2
2017     B    0    1  6
2010     C    1    1  3
2012     C    1    1  4
2017     C    1    1  2
2010     A    1    2  5
2012     A    1    2  1
2017     A    1    2  1
2010     B    0    2  3
2012     B    0    2  4
2017     B    0    2  5
2010     C    1    2  2
2012     C    1    2  3
2017     C    1    2  0

现在我想要的是在每个“年”和“区域”内为left == 1创建一个新变量,即“pp”的平均值。但我也想将其添加到 left == 0 的子集。

我试过了:

df %>%
  group_by(year, left, area) %>%
  mutate(mean_left = mean(pp)) %>% ungroup()

但这给了我一个特定于 left == 0 的值和一个特定于 left == 1 的值(在每年的派对中)。

year party  left  area    pp mean_left
<dbl> <chr> <dbl> <dbl> <dbl>     <dbl>
2010 A         1     1     3       3  
2012 A         1     1     4       4  
2017 A         1     1     5       3.5
2010 B         0     1     1       1  
2012 B         0     1     2       2  
2017 B         0     1     6       6  
2010 C         1     1     3       3  
2012 C         1     1     4       4  
2017 C         1     1     2       3.5
2010 A         1     2     5       3.5
2012 A         1     2     1       2  
2017 A         1     2     1       0.5
2010 B         0     2     3       3  
2012 B         0     2     4       4  
2017 B         0     2     5       5  
2010 C         1     2     2       3.5
2012 C         1     2     3       2  
2017 C         1     2     0       0.5

我也试过:

df %>%
  group_by(year, left, area) %>%
  mutate(mean_left = mean(df$pp[df$left==1])) %>% ungroup()

但是这里 group_by 函数似乎失败了,我在所有列中得到 2.75(这是 mean(df$pp[df$left==1]) 的值)

我怎样才能得到每年的平均分数 & 左边的面积 == 1,将这个相同的数字添加到今年 & 左边的面积 == 2?

它应该看起来像:

year party  left  area    pp mean_left
<dbl> <chr> <dbl> <dbl> <dbl>     <dbl>
2010 A         1     1     3       3  
2012 A         1     1     4       4  
2017 A         1     1     5       3.5
2010 B         0     1     1       3  
2012 B         0     1     2       4  
2017 B         0     1     6       3.5  
2010 C         1     1     3       3  
2012 C         1     1     4       4  
2017 C         1     1     2       3.5
2010 A         1     2     5       3.5
2012 A         1     2     1       2  
2017 A         1     2     1       0.5
2010 B         0     2     3       3.5  
2012 B         0     2     4       2  
2017 B         0     2     5       0.5  
2010 C         1     2     2       3.5
2012 C         1     2     3       2  
2017 C         1     2     0       0.5

提前致谢!

你走在正确的轨道上;你不能 group_by left 但 select 它在你的平均函数范围内。

df %>%
  group_by(year, area) %>%
  mutate(mean_left = mean(pp[left == 1])) %>%
  ungroup()

输出

# A tibble: 18 x 6
    year party  left  area    pp mean_left
   <dbl> <chr> <dbl> <dbl> <dbl>     <dbl>
 1  2010 A         1     1     3       3  
 2  2012 A         1     1     4       4  
 3  2017 A         1     1     5       3.5
 4  2010 B         0     1     1       3  
 5  2012 B         0     1     2       4  
 6  2017 B         0     1     6       3.5
 7  2010 C         1     1     3       3  
 8  2012 C         1     1     4       4  
 9  2017 C         1     1     2       3.5
10  2010 A         1     2     5       3.5
11  2012 A         1     2     1       2  
12  2017 A         1     2     1       0.5
13  2010 B         0     2     3       3.5
14  2012 B         0     2     4       2  
15  2017 B         0     2     5       0.5
16  2010 C         1     2     2       3.5
17  2012 C         1     2     3       2  
18  2017 C         1     2     0       0.5