【问题标题】:Mutate subset average and add to all groups R变异子集平均值并添加到所有组 R
【发布时间】:2022-01-11 15:31:07
【问题描述】:

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

假设我有以下数据:

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

提前致谢!

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    你走在正确的轨道上;你不能 group_by left 而是在你的平均函数中选择它。

    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
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 2020-05-06
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多