在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
相关产品推荐
相关产品推荐

