如何用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") } }
错误点说明
- 条件判断误用
&&(逻辑与):单个物种名不可能同时等于三个不同值,应使用||(逻辑或)或%in% - else块语法错误:缺少
if关键字,且未处理Streptomyces的匹配 - 仅打印结果,未将值赋值到目标新列中
正确的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
相关产品推荐
相关产品推荐

