dplyr/forcats 中是否有函数显示二分变量数据框中的计数和百分比?
Is there a function in dplyr/forcats to display count and percentages from a dataframe of dichotomous variables?
当我想在我的数据集中总结分类变量时,我经常被卡住。我的数据集包含每个患者的二分变量 (yes/no)。在下面的示例集中,“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..
最终目标是对具有连续变量和分类变量的研究人群的基线特征进行大总结 table。可能会尝试使用 CBCgrps 或 tableone.
谢谢!
使用 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
我想知道这个 tidyverse 解决方案是否适合您。转为长格式,按“组”和“答案”分组。总结每个“组”和“答案”组合中的案例计数,然后剥离“答案”并按 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%
您可以使用 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
当我想在我的数据集中总结分类变量时,我经常被卡住。我的数据集包含每个患者的二分变量 (yes/no)。在下面的示例集中,“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..
最终目标是对具有连续变量和分类变量的研究人群的基线特征进行大总结 table。可能会尝试使用 CBCgrps 或 tableone.
谢谢!
使用 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
我想知道这个 tidyverse 解决方案是否适合您。转为长格式,按“组”和“答案”分组。总结每个“组”和“答案”组合中的案例计数,然后剥离“答案”并按 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%
您可以使用 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