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)