将group_by计算出的百分比添加到该组中的所有行吗?

时间:2019-06-25 18:39:08

标签: r dplyr

示例代码

mtcars %>% group_by(am, gear) %>% summarise (n = n()) %>% mutate(percent_pos = n / sum(n))

结果是:

# A tibble: 4 x 4
# Groups:   am [2]
     am  gear     n percent_pos
  <dbl> <dbl> <int>       <dbl>
1     0     3    15       0.789
2     0     4     4       0.211
3     1     4     8       0.615
4     1     5     5       0.385

我想通过percent_pos数据框中带有标签am = 0的新列,将mtcars列的0.789值添加到percentage_positive的所有汽车中

尽管在此示例中,我可以严格引用am = 0或am = 1(使用if语句等),但在我的真实数据集中,我将有数百个日期将应用于该日期,因此很难手动编码每个参考。

我希望使用dplyr的group_by函数将值应用到按“ am”分组的所有行上,但是在这里使用mutate函数时遇到了麻烦。

3 个答案:

答案 0 :(得分:1)

我不确定我通过以下内容完全理解您的意思:

  

我想通过mtcars数据框中带有标签percent_positive的新列,将percent_pos列的0.789的值添加到am = 0的所有汽车中

问题是您为percent_pos计算了多个不同的am == 0值(实际上是为am的每个值)。因此,仅强调第一个值似乎有些武断。也许这正是您所追求的,但是从所提供的信息中并不清楚。另一方面,如果您的问题实际上是:

  

如何将与percent_posam的每个唯一组合对应的计算出的gear值映射回原始数据?

然后,以下简单的left_join操作将带您到达那里:

mtcars %>%
  left_join(
    mtcars %>%
      group_by(am, gear) %>%
      summarise (n = n()) %>%
      mutate(percent_pos = n / sum(n)),
    by = c('am', 'gear')
  )

生成的小标题的前/后4行如下所示:

    mpg cyl disp  hp drat    wt  qsec vs am gear carb  n percent_pos
1  21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  8   0.6153846
2  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  8   0.6153846
3  22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  8   0.6153846
4  21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 15   0.7894737

29 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4  5   0.3846154
30 19.7   6  145 175 3.62 2.770 15.50  0  1    5    6  5   0.3846154
31 15.0   8  301 335 3.54 3.570 14.60  0  1    5    8  5   0.3846154
31 21.4   4  121 109 4.11 2.780 18.60  1  1    4    2  8   0.6153846

这种方法应该能够扩展到任意数量的分组变量。

答案 1 :(得分:1)

如果您只希望每次记录最多的百分比,请尝试以下

max.per <- mtcars %>%
   group_by(am, gear) %>%
   summarise (n = n()) %>%
   mutate(percent_pos = n / sum(n)) %>%
   mutate(percent_pos = max(percent_pos)) %>%
   distinct(am,gear, percent_pos)

# A tibble: 4 x 3
# Groups:   am [2]
     am  gear percent_pos
  <dbl> <dbl>       <dbl>
1     0     3       0.789
2     0     4       0.789
3     1     4       0.615
4     1     5       0.615


mtc <- merge(mtcars, max.per, by = c("am","gear"))

答案 2 :(得分:0)

我不确定我是否理解您的问题,但是mutate_if可能是一个解决方案。条件am == 0 彼得