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

如何用for循环为R数据框添加革兰氏染色结果列?

用for循环为R数据框添加革兰氏染色结果列

原始数据框

species_abundance <- data.frame(
  ID=c(1,2,3,4,5),
  Genus = c("Sphingopyxis marina","Loktanella salsilacus",
            "Paracoccus chinensis","Bacillus","Streptomyces")
)

需求

通过for循环匹配Genus列的物种名称,新增Grams_staining列,填充对应的革兰氏阴性/阳性结果,预期输出如下:

species_abundance <- data.frame(
  ID=c(1,2,3,4,5),
  Genus = c("Sphingopyxis marina","Loktanella salsilacus",
            "Paracoccus chinensis","Bacillus","Streptomyces"),
  Grams_staining=c("grams_negative", "grams_negative", "grams_negative", "grams_positive", "grams_positive")
)

尝试的错误代码

for(i in 1:nrow(species_abundance)) {# for-loop over columns
  if (species_abundance[i,2] == "Sphingopyxis marina"&&
      species_abundance[i,2] == "Loktanella salsilacus"&&
      species_abundance[i,2] == "Paracoccus chinensis"){
      print("grams_negative")
  }
  
  else {
    species_abundance[i,2] == "Bacillus"{
     print("grams_positive")
  }  
}

错误点说明

  1. 条件判断误用&&(逻辑与):单个物种名不可能同时等于三个不同值,应使用||(逻辑或)或%in%
  2. else块语法错误:缺少if关键字,且未处理Streptomyces的匹配
  3. 仅打印结果,未将值赋值到目标新列中

正确的for循环实现

# 提前初始化新列,避免循环中动态扩容影响性能
species_abundance$Grams_staining <- NA

# 定义革兰氏阴性、阳性物种列表,便于后续维护
gram_neg_species <- c("Sphingopyxis marina", "Loktanella salsilacus", "Paracoccus chinensis")
gram_pos_species <- c("Bacillus", "Streptomyces")

# 遍历每一行进行判断赋值
for(i in 1:nrow(species_abundance)) {
  current_sp <- species_abundance$Genus[i]
  if(current_sp %in% gram_neg_species) {
    species_abundance$Grams_staining[i] <- "grams_negative"
  } else if(current_sp %in% gram_pos_species) {
    species_abundance$Grams_staining[i] <- "grams_positive"
  }
}

# 查看最终结果
print(species_abundance)

代码说明

  • 提前初始化新列:R中循环动态添加列会降低运行效率,先将列设为NA再填充更合理
  • 用%in%匹配列表:比多个==拼接更简洁,后续新增物种只需修改列表即可
  • 覆盖所有目标物种:同时处理了阴性、阳性的全部目标物种,避免遗漏

内容的提问来源于stack exchange,提问作者Umar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:16:06