如何按均值±标准差分组MM_score?现有代码合理性咨询
代码合理性分析与修正
你的代码和需求逻辑完全不匹配,存在以下核心问题:
1. 核心变量与需求不匹配
你的需求是基于MM_score自身的均值和标准差划分区间,但代码里使用的是cut_off和dv变量——如果这两个变量不是预先计算好的MM_score均值/标准差,完全无法实现你想要的分组规则。
2. 逻辑判断顺序错误
case_when是按从上到下的顺序匹配条件,你的第二个条件MM_score > (cut_off - dv)会覆盖绝大多数情况:
假设cut_off - dv小于cut_off + dv(这是合理的默认场景),那么所有满足第三个条件(cut_off - dv) >= MM_score & MM_score <= (cut_off + dv)的数值,必然也满足MM_score > (cut_off - dv),导致第三个条件永远不会被触发,等同于无效代码。
3. 分组规则与需求不符
需求明确的分组逻辑是:
- 高于(均值+标准差) 或 低于(均值-标准差) →
high score - 介于两者之间 →
intermediate score
但你的代码逻辑是:
- 小于
cut_off + dv→LMM - 大于
cut_off - dv→HMM - 介于
cut_off - dv和cut_off + dv之间 →IMM
区间划分和标签命名均与需求完全不一致。
修正后的代码
如果要严格实现你的需求,应先计算MM_score的均值和标准差,再执行分组:
dat %>% mutate( # 计算MM_score的均值和标准差,同时处理缺失值 mm_mean = mean(MM_score, na.rm = TRUE), mm_sd = sd(MM_score, na.rm = TRUE), # 按需求规则分组 MM_levels = case_when( MM_score > (mm_mean + mm_sd) | MM_score < (mm_mean - mm_sd) ~ "high score", TRUE ~ "intermediate score" ) )
如果你的cut_off就是MM_score的均值、dv就是MM_score的标准差,可简化为:
dat %>% mutate( MM_levels = case_when( MM_score > (cut_off + dv) | MM_score < (cut_off - dv) ~ "high score", TRUE ~ "intermediate score" ) )
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

