如何修复R代码以生成变量各水平的计数与占比表格
问题描述
构建的数据集:
my_data <- data.frame( learner_code = 1:8, lsk = c(0, 10, 20, 30, 50, 15, 25, 40) )
需求:基于学习者得分对lsk变量创建分类,生成各分类的学习者计数与占比表格。
当前使用代码:
lsk_cat1 <- my_data %>% mutate(lsk = case_when (lsk == 0 ~ "0", lsk >0 & lsk < 20 ~ "1-19", lsk > 19 & lsk < 40 ~ "20-39", lsk>= 40 ~ "40+" )) %>% group_by(lsk) %>% summarise(n = length(lsk), proportion = round(length(lsk)/8*100, 1))
异常输出:
n proportion 8 100
预期输出:
lsk n proportion 1 0 1 12.5 2 1-19 3 37.5 3 20-39 3 37.5 4 40+ 1 12.5
该代码在其他数据集可正常运行,当前出现异常,需修复。
问题原因与修复方案
问题根源
在mutate中直接将数值型的lsk覆盖为字符型,部分旧版dplyr环境下group_by无法正确识别新生成的字符分组变量,导致所有数据被归为同一组统计。另外硬编码总样本量8的写法不够灵活,后续样本量变化时会出错。
修复后的代码
library(dplyr) my_data <- data.frame( learner_code = 1:8, lsk = c(0, 10, 20, 30, 50, 15, 25, 40) ) lsk_cat1 <- my_data %>% # 新增分类列,不覆盖原变量 mutate(lsk_category = case_when( lsk == 0 ~ "0", lsk > 0 & lsk < 20 ~ "1-19", lsk > 19 & lsk < 40 ~ "20-39", lsk >= 40 ~ "40+" )) %>% # 基于新分类列分组 group_by(lsk_category) %>% summarise( n = n(), # 用n()统计每组数量,更符合dplyr语法 proportion = round(n() / nrow(my_data) * 100, 1) ) %>% # 重命名列匹配预期输出 rename(lsk = lsk_category) print(lsk_cat1)
输出结果
# A tibble: 4 × 3 lsk n proportion <chr> <int> <dbl> 1 0 1 12.5 2 1-19 3 37.5 3 20-39 3 37.5 4 40+ 1 12.5
优化说明
- 不覆盖原
lsk变量,新增分类列避免类型转换导致的分组识别问题; - 用
n()替代length(lsk),更贴合dplyr的使用习惯; - 用
nrow(my_data)替代硬编码的8,提升代码复用性; - 通过
rename()统一列名,匹配预期输出格式。
内容的提问来源于stack exchange,提问作者Paige Cox
相关产品推荐
相关产品推荐

