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

在R中比较多字符列数据框并按条件生成新列

R实现物种分类结果自动化汇总

现有一个包含5种物种分类方法结果的数据框,需要为每行生成desired_output列,规则如下:

  • 仅检测到一种有效物种时,输出该物种名称
  • 检测到多种不同物种时,输出"ERROR"
  • 无有效物种检测到时,输出"NA"

示例数据

code <- sprintf("sample % d", 1:5)

Specie_methodA<- c("NA", "NA","NA","NA", "Escherichia coli")
Specie_methodB<- c("Methanobrevibacter smithii", "NA", "NA","Blautia faecis","NA")
Specie_methodC<- c("","","","Blautia faecis"," ")
Specie_methodD<-c("NA","NA","CAG-41_sp900066215","NA"," ")
Specie_methodE<-c("","","","","Campylobacter coli")

table <- data.frame(code, Specie_methodA, Specie_methodB, Specie_methodC, Specie_methodD, Specie_methodE)

解决方案

方法一:使用dplyr包

library(dplyr)

table2 <- table %>%
  # 统一清理无效值:将"NA"、空字符串、空格替换为NA
  mutate(across(starts_with("Specie_"), ~na_if(., "NA"))) %>%
  mutate(across(starts_with("Specie_"), ~na_if(., ""))) %>%
  mutate(across(starts_with("Specie_"), ~na_if(., " "))) %>%
  rowwise() %>%
  mutate(
    # 提取每行非NA的物种并去重
    unique_species = list(na.omit(unique(c_across(starts_with("Specie_"))))),
    # 根据物种数量生成结果
    desired_output = case_when(
      length(unique_species) == 1 ~ unique_species[[1]],
      length(unique_species) > 1 ~ "ERROR",
      TRUE ~ "NA"
    )
  ) %>%
  ungroup() %>%
  select(-unique_species) # 移除中间临时列

方法二:Base R原生实现

# 第一步:清理所有无效值
clean_table <- table
clean_table[, -1] <- lapply(clean_table[, -1], function(x) {
  x[x %in% c("NA", "", " ")] <- NA
  x
})

# 第二步:逐行处理生成结果
desired_output <- apply(clean_table[, -1], 1, function(row) {
  species <- na.omit(unique(row))
  switch(as.character(length(species)),
         "0" = "NA",
         "1" = species,
         "ERROR")
})

# 合并结果到原数据框
table2 <- cbind(clean_table, desired_output)

验证结果

处理后的table2完全匹配期望输出:

# 生成的desired_output列结果:
# c("Methanobrevibacter smithii", "NA","CAG-41_sp900066215","Blautia faecis","ERROR")

内容的提问来源于stack exchange,提问作者MagíBC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:10:35