R语言跨多列统计毒性特征变量并将结果保留至数据集的方法
代码出错的核心原因
- 逻辑规则错误:
|为逻辑或运算符,原有写法仅在最后一个条件判断了值是否为Fatigue,前面的Dataset$Toxicity.1|Dataset$Toxicity.2等判断逻辑为「该列是否为非空真值」,只要对应列有值就返回TRUE,和需求完全不符。 - 存在笔误:代码中
Dataset被误写为Datase,且重复写了两次Toxicity.4,缺少第5个毒性列的判断。
方案1:基础R实现
写法1:直接补全逻辑判断
适合列数较少的场景,把每个列的判断条件写全即可:
Dataset$Fatigue.any.grade <- ifelse( Dataset$Toxicity.1 == "Fatigue" | Dataset$Toxicity.2 == "Fatigue" | Dataset$Toxicity.3 == "Fatigue" | Dataset$Toxicity.4 == "Fatigue" | Dataset$Toxicity.5 == "Fatigue", "Yes", "No" )
写法2:用rowSums批量判断(更简洁易扩展)
如果后续要增加毒性列,仅需要修改1:5的范围即可:
# 提取所有毒性列的列名 tox_cols <- paste0("Toxicity.", 1:5) # 统计每行等于Fatigue的数量,大于0说明出现过疲劳毒性 Dataset$Fatigue.any.grade <- ifelse( rowSums(Dataset[tox_cols] == "Fatigue", na.rm = TRUE) > 0, "Yes", "No" )
参数na.rm = TRUE可以避免数据中的NA值导致结果返回NA。
方案2:tidyverse/dplyr实现
用dplyr内置的if_any函数,语法更清晰,适合已经在使用tidyverse生态的场景:
library(dplyr) Dataset <- Dataset %>% mutate( Fatigue.any.grade = ifelse( if_any(starts_with("Toxicity."), ~.x == "Fatigue"), "Yes", "No" ) )
starts_with("Toxicity.")会自动匹配所有以Toxicity.开头的列,不需要手动写全列名。
内容的提问来源于stack exchange,提问作者r9ronaldor9
相关产品推荐
相关产品推荐

