使用purrr::map计算分组后因子变量占比时遇错误求解决
解决方案
首先,报错的核心原因是**count()不能嵌套在summarise()中使用**,count()是dplyr的独立频数统计函数,而summarise()需要搭配n()这类聚合函数来计算分组内统计量。
以下是两种能实现需求的代码方案:
方法一:先统计频数再计算占比
library(purrr) library(dplyr) mtcars_list <- c("am","gear","carb") mtcars$vs <- factor(mtcars$vs , levels=c('0', '1')) map(mtcars_list, ~ mtcars %>% group_by(cyl, .data[[.x]], vs) %>% summarise(n = n(), .groups = "drop_last") %>% mutate(percent = (n / sum(n)) * 100) %>% ungroup())
方法二:用prop.table简化百分比计算
map(mtcars_list, ~ mtcars %>% group_by(cyl, .data[[.x]]) %>% summarise( vs_0_pct = prop.table(table(vs))["0"] * 100, vs_1_pct = prop.table(table(vs))["1"] * 100, .groups = "drop" ))
代码说明
- 方法一:先按
cyl、列表变量、vs三级分组统计数量,再在cyl+列表变量的分组内,计算每个vs水平占该分组总数的百分比。 - 方法二:直接在分组内生成
vs的频数表,通过prop.table转换为比例后乘以100得到百分比,结果会将vs的两个水平作为单独列展示。
两种方案都能输出你需要的结果:按cyl和列表中每个变量分组后,vs的0、1水平各自占分组总数的百分比。
内容的提问来源于stack exchange,提问作者FrancoBattiato
相关产品推荐
相关产品推荐

