我正在尝试从“这里有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)
我正在尝试创建一个表,该表显示选择总数和百分比(选择至少一个选项的人数计数),然后还可以按协变量细分。例如。下表或M和F的下表的两个版本(但在石斑鱼中可能超过两个类别)。请注意,在我的示例中,第四行是未选择类别的人,因此不属于百分比的分母。
变量 | 总数 | 总体 % |
---|---|---|
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)
但是我正努力使其他变量更通用,并且不确定当要用grouper变量分隔表时如何整齐地做。
您可以删除具有所有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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句