示例代码
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函数时遇到了麻烦。
答案 0 :(得分:1)
我不确定我通过以下内容完全理解您的意思:
我想通过mtcars数据框中带有标签percent_positive的新列,将percent_pos列的0.789的值添加到am = 0的所有汽车中
问题是您为percent_pos
计算了多个不同的am == 0
值(实际上是为am
的每个值)。因此,仅强调第一个值似乎有些武断。也许这正是您所追求的,但是从所提供的信息中并不清楚。另一方面,如果您的问题实际上是:
如何将与
percent_pos
和am
的每个唯一组合对应的计算出的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 彼得