比较多个字符列dataframe R并根据条件创建新列



如果可能的话,我正在尝试在R中自动化一个过程,以避免手动操作,因为它将是5000行手动检查。

为了更清楚地说明我想要做的过程,我附加了一个简单的示例。

我比较了5种方法将一些reads分类为物种。

以前5种情况为例:

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)

对于每一行,我想检查是否获得了特定的物种,如果是这样,则在新列中打印其名称(表2中的desired_output,请参阅下面的代码)。如果在5种方法之间的一行内获得两个不同的物种,我希望有一个"error";字符串输出。如果5种方法中的任何一种都没有检测到物种,则会打印&;na&;。

因此,根据上面的表,我希望得到下一个输出:

desired_output<-c("Methanobrevibacter smithii", "NA","CAG-41_sp90006621","Blautia faecis","ERROR")
table2 <- data.frame(code, Specie_methodA, Specie_methodB, Specie_methodC, Specie_methodD, Specie_methodE,desired_output)

可以创建一个用户定义的函数

get_desired_output <- function(specie1,specie2,specie3,specie4,specie5){
species <- c(specie1,specie2,specie3,specie4,specie5)
# remove empty string, NA string and duplicates
species <- species[!(species%in%c('NA',''))]%>%unique()
if(length(species)==0){
return('NA')
}
if(length(species)>1){
return('ERROR')
}
return(species)
}

如果dplyr>=1.0.0:

output <- table%>%
mutate(across(Specie_methodA:Specie_methodE, as.character))%>%
rowwise()%>%
mutate(desired_output=get_desired_output(Specie_methodA,Specie_methodB,Specie_methodC,Specie_methodD,Specie_methodE))

如果dplyr<1.0.0:

output <- table%>%
mutate_at(vars(Specie_methodA:Specie_methodE),as.character)%>%
rowwise()%>%
mutate(desired_output=get_desired_output(Specie_methodA,Specie_methodB,Specie_methodC,Specie_methodD,Specie_methodE))
> output
Source: local data frame [5 x 7]
Groups: <by row>
# A tibble: 5 x 7
code     Specie_methodA  Specie_methodB       Specie_methodC Specie_methodD   Specie_methodE   desired_output      
<fct>    <chr>           <chr>                <chr>          <chr>            <chr>            <chr>               
1 sample ~ NA              Methanobrevibacter ~ ""             NA               ""               Methanobrevibacter ~
2 sample ~ NA              NA                   ""             NA               ""               NA                  
3 sample ~ NA              NA                   ""             CAG-41_sp900066~ ""               CAG-41_sp900066215  
4 sample ~ NA              Blautia faecis       Blautia faecis NA               ""               Blautia faecis      
5 sample ~ Escherichia co~ NA                   ""             ""               Campylobacter c~ ERROR

最新更新