在R语言中基于多列数值创建分组的问题
问题解决:正确分组逻辑实现
需求说明
基于Score1至Score4的分类创建分组规则:
- 对照组:所有分数均属于对应低问题组的参与者
- 实验组:只要有任意一项分数属于中/高问题组的参与者
原代码错误分析
你原来的代码使用了|(逻辑或),只要某一项符合低分组条件就判定为对照组,这完全违背了需求逻辑。正确的逻辑应该是:只有当所有分数都满足低分组条件时才归为对照组,否则归为实验组。
修正方案
方案1:使用case_when与逻辑与(&)
library(dplyr) df <- df %>% mutate(Group = case_when( # 所有分数都符合低问题组条件才是对照组 Score1 == "(25-30)" & Score2 == "(0-5)" & Score3 == "(12-20)" & Score4 == "(1-20)" ~ "Control", # 其余情况均为实验组 TRUE ~ "Experimental" ))
方案2:使用if_all更简洁实现(dplyr 1.0.0+版本支持)
利用if_all可以批量检查指定列是否都满足条件,代码更简洁:
library(dplyr) df <- df %>% mutate(Group = if_all(Score1:Score4, ~ .x %in% c("(25-30)", "(0-5)", "(12-20)", "(1-20)")) ? "Control" : "Experimental")
注:这里
%in%后的向量对应各列的低问题组取值,确保每列的取值都在对应低分组范围内。
正确运行结果
ID Score1 Score2 Score3 Score4 Group 1 A (25-30) (0-5) (12-20) (1-20) Control 2 B (31-40) (6-11) (21-42) (21-60) Experimental 3 C (41-60) (25-30) (43-55) (61-80) Experimental 4 D (25-30) (6-11) (12-20) (1-20) Experimental 5 E (25-30) (0-5) (21-42) (1-20) Experimental 6 F (25-30) (0-5) (12-20) (1-20) Control
可以看到参与者D和E现在被正确分到了实验组。
内容的提问来源于stack exchange,提问作者dplyr
相关产品推荐
相关产品推荐

