You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:36:05