如何在R的case_when函数中正确使用多个AND逻辑运算?
问题分析与解决
你的代码逻辑本身是成立的,但出现不符合预期的归类结果,大概率是以下原因导致,对应解决方案如下:
1. 检查数据类型是否异常
ScoreA或ScoreB如果是字符型/因子型而非数值型,会导致数值比较逻辑紊乱。比如字符型的"10"在某些场景下的比较结果会偏离预期,或含非数值字符(如"10分")会转为NA干扰判断。
先检查列类型:
str(df$ScoreA) str(df$ScoreB)
如果不是数值型,先转换:
df <- df %>% mutate(across(c(ScoreA, ScoreB), as.numeric))
2. 优化条件顺序(更严谨)
虽然你的条件逻辑互斥,但把ScoreB>=8的判断放在ScoreA<8 & ScoreB<8前面,能避免潜在的顺序误解,结果一致但更直观:
df <- df %>% mutate(New_Var = case_when( age == 6 & ScoreA >= 8 ~ "Strong", age == 6 & ScoreB >= 8 ~ "Weak", age == 6 & ScoreA < 8 & ScoreB < 8 ~ "Some" ))
3. 验证目标样本的实际值
确认你说的age=6、ScoreA=4、ScoreB=10样本的真实数据是否符合描述,避免输入错误:
df %>% filter(age == 6, ScoreA == 4, ScoreB == 10)
另外,在tidyverse管道中建议直接用列名(如age而非df$age),更简洁且能避免分组操作时的潜在问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

