R语言中如何在case_when内判断指定行范围是否存在值为1的元素
实现方案
方案1:沿用rowSums写法(改动最小,兼容原有逻辑)
你只需要在原有代码的基础上增加等于1的判断逻辑即可,生成的布尔值可以直接放到case_when中作为条件使用:
rowSums(select(., starts_with('type')) == 1, na.rm = TRUE) > 0
逻辑说明:先将所有type开头的列和1做等值判断,等于1的返回TRUE(对应数值1),其余返回FALSE(对应数值0),按行求和后大于0即说明该行存在至少一个值为1的元素。
方案2:使用rowwise+any写法(可读性更高)
如果使用dplyr 1.0.0及以上版本,可以用更直观的逐行判断逻辑:
- 单独生成判断列的写法:
df %>% rowwise() %>% mutate(has_one = any(c_across(starts_with('type')) == 1, na.rm = TRUE))
- 直接放到
case_when中作为条件的写法:
df %>% rowwise() %>% mutate( 结果列 = case_when( any(c_across(starts_with('type')) == 1, na.rm = TRUE) ~ TRUE, TRUE ~ FALSE ) )
逻辑说明:c_across会按行选取所有type开头的列,any函数直接判断选中的元素中是否存在至少一个符合等于1的条件。
注意事项
- 两个方案都保留了
na.rm = TRUE参数,遇到NA值会自动忽略,不会因为行内存在NA返回NA结果 - 如果你的
type开头的列是字符类型,需要先转为数值类型再做判断
内容的提问来源于stack exchange,提问作者MLE
相关产品推荐
相关产品推荐

