R语言按分数区间分组变量:样本量异常与ifelse赋值错误求助
问题解决与代码修正
原始代码的错误分析
filter方法的问题
- 数据生成错误:
sample(1:10)包含了不符合需求的10分,且代码缺失右括号;列名引用错误(test_scores1是不存在的列)。 - 筛选条件完全错误:
- 要筛选low组(1-3分),条件应为
test_scores <= 3,而非>3; - 要筛选high组(7-9分),条件应为
test_scores >=7,而非<7; - 筛选good组时,
test_scores == 4:6是向量逐元素匹配(而非判断是否属于该区间),正确写法是test_scores %in% 4:6;
- 要筛选low组(1-3分),条件应为
filter是筛选行生成新数据框,而非在原数据中添加分组变量,且错误条件会导致样本重复/遗漏,自然总和不等于122。
ifelse方法的问题
test_scores == 1:3是向量循环匹配:122个元素的test_scores会和循环重复的1:3逐位置比较,而非判断元素是否属于1-3区间,导致部分符合条件的元素因位置不匹配被判定为FALSE,赋值为0。正确的区间判断应使用%in%或between()。
正确实现代码
1. 生成符合要求的数据集
# 生成1-9的随机分数,共122个样本,转为数据框 test_scores <- data.frame(test_scores = sample(1:9, 122, replace = TRUE))
2. 添加分组变量(推荐用dplyr的case_when,清晰易读)
先加载dplyr包(如果未安装先运行install.packages("dplyr")):
library(dplyr) test_scores <- test_scores %>% mutate( # 生成分组标签:low(1-3)、good(4-6)、high(7-9) group = case_when( between(test_scores, 1, 3) ~ "low", between(test_scores, 4, 6) ~ "good", between(test_scores, 7, 9) ~ "high" ) )
也可以用基础R的cut函数实现:
test_scores$group <- cut(test_scores$test_scores, breaks = c(0, 3, 6, 9), labels = c("low", "good", "high"))
3. 生成对比变量
根据需求生成low与high、low与good的对比变量(以哑变量为例,仅保留目标对比组,其余设为NA):
test_scores <- test_scores %>% mutate( # low=1,high=0,good组设为NA(仅保留两组用于对比) low_vs_high = ifelse(group == "low", 1, ifelse(group == "high", 0, NA)), # low=1,good=0,high组设为NA(仅保留两组用于对比) low_vs_good = ifelse(group == "low", 1, ifelse(group == "good", 0, NA)) )
验证样本量
运行table(test_scores$group)可查看各组样本数,三者总和应为122,确认无遗漏或重复。
内容的提问来源于stack exchange,提问作者Marcus Meza
相关产品推荐
相关产品推荐

