R语言DataFrame多列使用ifelse判断生成含high标识计算列
你原有写法的错误主要有三点:
c(2:5)仅生成了四个数字向量,没有实际引用数据框的第2-5列数据- 你数据中的取值是小写
high,判断条件写的是大写High,大小写不匹配 - 没有按行判断「任意一列满足条件」的逻辑,原写法只会对单个元素做判断,不会按行聚合结果
基础R实现方案
不需要加载额外包,直接用基础函数即可完成:
# 取第2-5列按行判断是否存在high,忽略NA值 df$calculated_column <- as.integer(rowSums(df[, 2:5] == "high", na.rm = TRUE) > 0)
逻辑说明:df[, 2:5] == "high"会返回和目标列维度一致的逻辑矩阵,满足条件为TRUE、不满足或NA为FALSE;rowSums按行求和后大于0就代表至少有一列存在high,as.integer直接把逻辑值TRUE/FALSE转为1/0。
tidyverse/dplyr实现方案
如果习惯用dplyr处理数据,有更直观的写法:
写法1:用if_any(推荐,dplyr 1.0.0及以上版本支持)
library(dplyr) df <- df %>% mutate( calculated_column = as.integer(if_any( .cols = c(Winter, Spring, Summer, Fall), .fns = ~.x == "high", na.rm = TRUE )) )
写法2:按行判断
library(dplyr) df <- df %>% rowwise() %>% mutate( calculated_column = as.integer(any(c(Winter, Spring, Summer, Fall) == "high", na.rm = TRUE)) ) %>% ungroup() # 处理完取消行分组,避免后续操作出问题
如果需要兼容大小写不一致的情况,把判断条件里的== "high"替换为tolower(.x) == "high"即可。
内容的提问来源于stack exchange,提问作者piper180
相关产品推荐
相关产品推荐

