【问题标题】:Is there a function in dplyr/forcats to display count and percentages from a dataframe of dichotomous variables?dplyr/forcats 中是否有一个函数可以显示二分变量数据框中的计数和百分比?
【发布时间】:2021-02-04 04:44:31
【问题描述】:

当我想总结数据集中的分类变量时,我经常遇到困难。我的数据集包含每位患者的二分变量(是/否)。在下面的示例集中,“A-C”是该人有或没有的风险因素。

A <- c("yes", "no", "yes", "no", "yes")
B <- c("no", "no", "yes", "yes", "no")
C <- c("yes", "no", "yes", "no", "yes")

df <- data.frame(A, B, C)

我要做的是将所有变量汇总为因子水平计数和百分比 - 使用一行代码。我尝试使用 apply、forcats、dplyr 但无法正确使用。谁能帮帮我:)

我希望得到:

一个: 是 3 | %

没有 2 | %

乙:..

C..

最终目标是制作一个包含连续变量和分类变量的研究人群基线特征的大汇总表。可能会尝试使用 CBCgrps 或 tableone。

谢谢!

【问题讨论】:

  • 您能以您需要的格式发布您的预期输出吗?
  • 下面所有三个答案都得到了预期的输出:)
  • 是的,但格式不同:)

标签: r dplyr categorical-data baseline


【解决方案1】:

你可以使用forcats::fct_count():

library(purrr)
library(forcats)

map_df(df, fct_count, prop = TRUE, .id = "var")

# A tibble: 6 x 4
  var   f         n     p
  <chr> <fct> <int> <dbl>
1 A     no        2   0.4
2 A     yes       3   0.6
3 B     no        3   0.6
4 B     yes       2   0.4
5 C     no        2   0.4
6 C     yes       3   0.6

【讨论】:

    【解决方案2】:

    使用 Base R 有一个非常简单的解决方案:

    lapply(df, function(x){
     
     tb <- table(x)
     as.data.frame(cbind(n = tb, perc = tb / sum(tb)))
     
    })
    #> $A
    #>     n perc
    #> no  2  0.4
    #> yes 3  0.6
    #> 
    #> $B
    #>     n perc
    #> no  3  0.6
    #> yes 2  0.4
    #> 
    #> $C
    #>     n perc
    #> no  2  0.4
    #> yes 3  0.6
    

    【讨论】:

      【解决方案3】:

      我想知道这个 tidyverse 解决方案是否适合您。转为长格式,按“组”和“答案”分组。 Summarize 计算“组”和“答案”的每个组合中的案例,然后剥离“答案”并按 A、B 和 C 组计算百分比。取消分组“答案”的剥离,以便我们可以计算总体百分比。

      library(tidyverse)
      A <- c("yes", "no", "yes", "no", "yes")
      B <- c("no", "no", "yes", "yes", "no")
      C <- c("yes", "no", "yes", "no", "yes")
      
      df <- data.frame(A, B, C)
      df %>%
        pivot_longer(cols = everything(), names_to = "group", values_to = "answer") %>%
        group_by(group, answer) %>%
        summarise(n = n()) %>%
        mutate(percent_by_group = scales::percent(n / sum(n))) %>% 
        ungroup() %>% 
        mutate(percent_overall=scales::percent(n / sum(n)))
      

      这是结果

       # A tibble: 6 x 5
        group answer     n percent_by_group percent_overall
        <chr> <chr>  <int> <chr>            <chr>          
      1 A     no         2 40%              13.3%          
      2 A     yes        3 60%              20.0%          
      3 B     no         3 60%              20.0%          
      4 B     yes        2 40%              13.3%          
      5 C     no         2 40%              13.3%          
      6 C     yes        3 60%              20.0%     
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2016-05-27
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        相关资源
        最近更新 更多