【问题标题】:Nest multiple dplyr::summarise with different grouping variables使用不同的分组变量嵌套多个 dplyr::summarise
【发布时间】:2021-03-22 08:33:38
【问题描述】:

我有一个包含 100 条记录的数据框,包括 bmi 等级(高于或低于 30)、腰围等级(高于或低于阈值)和结果变量(已故 0 或 1)。

set.seed(1)
data <- 
tibble(bmiclass=sample(x=c(0,1), size=100, replace = TRUE),
       wcclass=sample(x=c(0,1), size=100, replace = TRUE),
       deceased=sample(x=c(0,1), size=100, replace = TRUE))

我需要在同一张表中获得两个信息:1)按 BMI 组划分的 WC 级别较高的受试者百分比,以及 2)按 BMI 组和 WC 级别划分的死亡风险。 我设法通过 left_join 函数加入两个 dplyr::group_by 和 dplyr::summarise 来做到这一点,如下所示:

data %>% group_by(bmiclass, wcclass) %>% dplyr::summarise(risk.death=sum(deceased)/n()*100) %>% 
  left_join(data %>% group_by(bmiclass) %>% dplyr::summarise(risk.wc=sum(wcclass)/n()*100), by="bmiclass")

但是我想知道是否有更直接的方法可以在没有 left_join 的情况下更简单地完成它?

【问题讨论】:

    标签: r dplyr group-by summarize


    【解决方案1】:

    这将等效地做同样的事情

    data %>% 
      group_by(bmiclass) %>%
      mutate(risk.wc = sum(wcclass)/n()*100) %>%
      group_by(bmiclass, wcclass, risk.wc) %>% summarise(risk.death=sum(deceased)/n()*100)
    
    # A tibble: 4 x 4
    # Groups:   bmiclass, wcclass [4]
      bmiclass wcclass risk.wc risk.death
         <dbl>   <dbl>   <dbl>      <dbl>
    1        0       0    49.0       52  
    2        0       1    49.0       50  
    3        1       0    45.1       64.3
    4        1       1    45.1       56.5
    

    用你的代码检查一下

    > data %>% group_by(bmiclass, wcclass) %>% dplyr::summarise(risk.death=sum(deceased)/n()*100) %>% 
    +   left_join(data %>% group_by(bmiclass) %>% dplyr::summarise(risk.wc=sum(wcclass)/n()*100), by="bmiclass")
    `summarise()` has grouped output by 'bmiclass'. You can override using the `.groups` argument.
    # A tibble: 4 x 4
    # Groups:   bmiclass [2]
      bmiclass wcclass risk.death risk.wc
         <dbl>   <dbl>      <dbl>   <dbl>
    1        0       0       52      49.0
    2        0       1       50      49.0
    3        1       0       64.3    45.1
    4        1       1       56.5    45.1
    

    【讨论】:

      【解决方案2】:

      无需执行连接即可:

      library(dplyr)
      
      data %>% 
        group_by(bmiclass, wcclass) %>%
        summarise(risk.death = mean(deceased*100), 
                  risk.wc = n()) %>%
        mutate(risk.wc = mean(rep(wcclass, risk.wc)) * 100) %>%
        ungroup
      
      #  bmiclass wcclass risk.death risk.wc
      #     <dbl>   <dbl>      <dbl>   <dbl>
      #1        0       0       52      49.0
      #2        0       1       50      49.0
      #3        1       0       64.3    45.1
      #4        1       1       56.5    45.1
      

      【讨论】:

        猜你喜欢
        • 2018-07-12
        • 1970-01-01
        • 2019-04-26
        • 2023-03-29
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多