【问题标题】:dplyr: Calculate percent change between summarized groupsdplyr:计算汇总组之间的百分比变化
【发布时间】:2021-07-31 10:05:33
【问题描述】:

我正在尝试计算组之间的百分比变化,在我的 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

【问题讨论】:

    标签: r dplyr percentage


    【解决方案1】:

    你想要这个吗?

    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 日创建

    【讨论】:

    • 非常感谢!!这看起来很棒!请问,如何设置它来计算数值,而不是字符? (例如,从行值中排除 % 符号)?
    • 酷,明白了!像mutate(perc_change = (my_mean - my_mean[grp == 'control'])/my_mean[grp == 'control']*100) 这样简单,或者甚至更简单?
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-19
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多