R 中重叠类别的计数和百分比
Counts and percentages for overlapping categories in R
我正在尝试从“这里有 10 个类别,选择 3 个”调查问题中总结重叠类别集。如果他们选择了每个类别,则每个类别都有一个值,如果没有选择,则为 NA。这是一个包含 3 个类别的虚拟示例:
P_A<-c("A","A",NA,NA)
P_B<-c(NA,"B","B",NA)
P_C<-c("C", NA, NA,NA)
grouper<-c("M", "M", "F","F")
data.df<-data.frame(P_A,P_B,P_C,grouper)
我正在尝试创建一个 table 来显示总人数 select 和百分比(计算 select 至少有一个选项的人数),然后也可以按协变量细分。例如。 M 和 F 的以下 table 或以下 table 的两个版本(但在石斑鱼中可能超过 2 个类别)。请注意,在我的示例中,第 4 行是 select 没有分类的人,因此不属于百分比的分母。
Variable
Overall count
Overall %
P_A
2
66.67
P_B
2
66.67
P_C
1
33.33
我可以使用 colSums(!isna(select(data.df, P_A:P_C)))
生成数字,然后除以 sum(rowSums(!is.na(select(data.df, P_A:P_C)))>0)
,但我正在努力使它对其他变量更具普遍性,并且我不确定在需要时如何巧妙地做到这一点用石斑鱼变量分隔 tables。
您可以删除包含所有 NA
值的行,以长格式获取数据,并为每列查找非 NA 值的数量和百分比。
library(dplyr)
data.df %>%
select(-grouper) %>%
filter(Reduce(`|`, across(.fns = ~!is.na(.)))) %>%
tidyr::pivot_longer(cols = everything()) %>%
group_by(name) %>%
summarise(count = sum(!is.na(value)),
overall_perc = count/n() * 100)
# name count overall_perc
# <chr> <int> <dbl>
#1 P_A 2 66.7
#2 P_B 2 66.7
#3 P_C 1 33.3
要针对 grouper
的每个类别执行此操作,您可以执行以下操作:
data.df %>%
filter(Reduce(`|`, across(-grouper, ~!is.na(.)))) %>%
tidyr::pivot_longer(cols = -grouper) %>%
group_by(name, grouper) %>%
summarise(count = sum(!is.na(value)),
overall_perc = count/n() * 100)
我正在尝试从“这里有 10 个类别,选择 3 个”调查问题中总结重叠类别集。如果他们选择了每个类别,则每个类别都有一个值,如果没有选择,则为 NA。这是一个包含 3 个类别的虚拟示例:
P_A<-c("A","A",NA,NA)
P_B<-c(NA,"B","B",NA)
P_C<-c("C", NA, NA,NA)
grouper<-c("M", "M", "F","F")
data.df<-data.frame(P_A,P_B,P_C,grouper)
我正在尝试创建一个 table 来显示总人数 select 和百分比(计算 select 至少有一个选项的人数),然后也可以按协变量细分。例如。 M 和 F 的以下 table 或以下 table 的两个版本(但在石斑鱼中可能超过 2 个类别)。请注意,在我的示例中,第 4 行是 select 没有分类的人,因此不属于百分比的分母。
Variable | Overall count | Overall % |
---|---|---|
P_A | 2 | 66.67 |
P_B | 2 | 66.67 |
P_C | 1 | 33.33 |
我可以使用 colSums(!isna(select(data.df, P_A:P_C)))
生成数字,然后除以 sum(rowSums(!is.na(select(data.df, P_A:P_C)))>0)
,但我正在努力使它对其他变量更具普遍性,并且我不确定在需要时如何巧妙地做到这一点用石斑鱼变量分隔 tables。
您可以删除包含所有 NA
值的行,以长格式获取数据,并为每列查找非 NA 值的数量和百分比。
library(dplyr)
data.df %>%
select(-grouper) %>%
filter(Reduce(`|`, across(.fns = ~!is.na(.)))) %>%
tidyr::pivot_longer(cols = everything()) %>%
group_by(name) %>%
summarise(count = sum(!is.na(value)),
overall_perc = count/n() * 100)
# name count overall_perc
# <chr> <int> <dbl>
#1 P_A 2 66.7
#2 P_B 2 66.7
#3 P_C 1 33.3
要针对 grouper
的每个类别执行此操作,您可以执行以下操作:
data.df %>%
filter(Reduce(`|`, across(-grouper, ~!is.na(.)))) %>%
tidyr::pivot_longer(cols = -grouper) %>%
group_by(name, grouper) %>%
summarise(count = sum(!is.na(value)),
overall_perc = count/n() * 100)