You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:47:10