dplyr:计算汇总组之间的百分比变化

时间:2021-07-31 10:05:33

标签: r dplyr percentage

我正在尝试计算组之间的百分比变化,使用一个控制和多个处理,在我的 data.frame 中组织为组。由于我有很多观察,我使用 dplyr。我不明白的是如何有效地设置要比较的组?通常,我会将这个任务分成多个步骤:

  • 按组计算平均值
  • 子集控制组以创建新的“控制”数据框
  • 将“控制”数据帧加入第一个 df
  • 计算对照和处理之间的百分比变化。

不过,我想知道 dplyr 是否已经有了更简单直接的方法?

虚拟示例

set.seed(5)
dd <- data.frame(id = rep(c(1:4), 3),
                 val = c(rnorm(4) +2,
                         rnorm(4) +3,
                         rnorm(4) +4),
                 grp = rep(c("control", "ch1", "ch2"), each = 4))

dd %>% 
  group_by(grp) %>% 
  summarise(my_mean = mean(val)) 

“对照”和个别治疗之间计算出的百分比变化的预期结果:

# A tibble: 3 x 2
  grp     my_mean   perc_change
  <fct>     <dbl>
1 ch1        2.30    XX
2 ch2        5.00    YY
3 control    1.39    0

2 个答案:

答案 0 :(得分:3)

你想要这个吗?

library(tidyverse)
set.seed(5)
dd <- data.frame(id = rep(c(1:4), 3),
                 val = c(rnorm(4) +2,
                         rnorm(4) +3,
                         rnorm(4) +4),
                 grp = rep(c("control", "ch1", "ch2"), each = 4))

dd %>% 
  group_by(grp) %>% 
  summarise(my_mean = mean(val)) %>%
  mutate(perc_change = scales::percent((my_mean - my_mean[grp == 'control'])/my_mean[grp == 'control']))
#> # A tibble: 3 x 3
#>   grp     my_mean perc_change
#>   <chr>     <dbl> <chr>      
#> 1 ch1        3.00 63%        
#> 2 ch2        4.07 121%       
#> 3 control    1.84 0%

reprex package (v2.0.0) 于 2021 年 7 月 31 日创建

答案 1 :(得分:2)

你在找这个吗?

library(dplyr)

dd %>% 
  group_by(grp) %>% 
  summarise(my_mean = mean(val))  %>%
  mutate(perc_change = (my_mean - my_mean[match('control', grp)])/ my_mean[match('control', grp)] * 100)
  #Also we can use '=='
  #mutate(perc_change = (my_mean - my_mean[grp == 'control'])/ my_mean[grp == 'control'] * 100)