问题描述
当我要总结数据集中的分类变量时,我经常会卡住。我的数据集包含每个患者的二分变量(是/否)。在以下示例集中,“ A-C”是该人有或没有的危险因素。
A <- c("yes","no","yes","yes")
B <- c("no","no")
C <- c("yes","yes")
df <- data.frame(A,B,C)
我想做的是用一行代码总结所有变量,以计算级别数和百分比。我尝试使用apply,forcats,dplyr,但无法正确执行。谁能帮我:)
我希望得到:
A: 是3 | %
否2 | %
B:..
C ..
最终目标是制作一个包含连续变量和分类变量的研究人群基线特征的大汇总表。可能会尝试使用CBCgrps或tableone。
谢谢!
解决方法
您可以使用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
,
有了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
,
我想知道这种整洁的解决方案是否适合您。旋转为长格式,按“组”和“答案”分组。汇总计数“组”和“答案”的每个组合中的个案,然后剥离“答案”,并由A,B和C组计算百分比。对“答案”的剥离进行分组,以便我们可以整体计算百分比。
library(tidyverse)
A <- c("yes","no","yes","yes")
B <- c("no","no")
C <- c("yes","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%