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

R语言按分数区间分组变量:样本量异常与ifelse赋值错误求助

问题解决与代码修正

原始代码的错误分析

filter方法的问题

  1. 数据生成错误:sample(1:10)包含了不符合需求的10分,且代码缺失右括号;列名引用错误(test_scores1是不存在的列)。
  2. 筛选条件完全错误:
    • 要筛选low组(1-3分),条件应为test_scores <= 3,而非>3;
    • 要筛选high组(7-9分),条件应为test_scores >=7,而非<7;
    • 筛选good组时,test_scores == 4:6是向量逐元素匹配(而非判断是否属于该区间),正确写法是test_scores %in% 4:6;
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:21:07