如何在R的case_when函数中合并AND与OR条件实现单行逻辑判断?
在R的case_when中合并与(&)和或(|)逻辑的正确方式
你的问题出在逻辑运算符的优先级上:&的运算优先级高于|,所以你之前的代码实际执行的是(year >= since & end > year) | is.na(end)——这会导致只要end是NA,不管year >= since是否满足,都会返回1,完全偏离了你的需求。
要实现「year >= since 且(end > year 或 end为NA)」的逻辑,只需要给(end > year | is.na(end))加上括号,强制先计算或条件,再和前面的与条件结合即可。
正确的单行代码
df3 <- df2 %>% left_join(df1, by = "company") %>% mutate(new_var = case_when(year >= since & (end > year | is.na(end)) ~ 1, TRUE ~ 0)) %>% select(!c(since, end))
验证输出
运行后得到符合预期的结果:
company year new_var 1 A 2013 0 2 B 2013 0 3 C 2013 0 4 D 2013 1 5 A 2014 1 6 B 2014 0 7 C 2014 1 8 D 2014 0 9 A 2015 1 10 B 2015 0 11 C 2015 1 12 D 2015 0
补充说明
如果追求更简洁的写法,也可以用is.na(end) | end > year替换括号里的内容,逻辑完全一致。核心原则就是通过括号明确逻辑运算的分组顺序,避免优先级导致的逻辑错误。
内容的提问来源于stack exchange,提问作者Joost Maxen
相关产品推荐
相关产品推荐

