- 已编辑
老师们,请教一个用R里for循环结合if来修改文本名的问题:
res_S的内容如下:
`
Classification
1 kBacteria|suncultured_bacterium_pAKD4
2 kBacteria|sbacterium_enrichment_culture_clone_2a(2010)
3 kBacteria|pCandidatus_Gracilibacteria|sCandidatus_Gracilibacteria_bacterium_HOT-871
4 kBacteria|pCoprothermobacterota
2724 kBacteria|pActinobacteria|cActinobacteria
2725 kBacteria|pActinobacteria|cActinobacteria|oCorynebacteriales
6423 kViruses|oCaudovirales|fMyoviridae|sProchlorococcus_phage_P-TIM68
6424 kViruses|oCaudovirales|fMyoviridae|gBusanvirus|sAcidovorax_virus_ACP17
6920 kViruses|oCaudovirales|fSiphoviridae|gTimquatrovirus|sMycobacterium_phage_Keshu
6921 kViruses|oCaudovirales|fSiphoviridae|gTimquatrovirus|sMycobacterium_phage_Omnicron
6922 kViruses|oCaudovirales|fSiphoviridae|gTimquatrovirus|sMycobacterium_phage_ZoeJ
6923 kViruses|oCaudovirales|fSiphoviridae|sVerrucomicrobia_phage_P8625
6924 kViruses|oCaudovirales|fSiphoviridae|sAchromobacter_phage_JWF
6925 kViruses|oCaudovirales|fSiphoviridae|sTsukamurella_phage_TPA4
6926 kViruses|oCaudovirales|fSiphoviridae|sSynechococcus_phage_S-CBS2
6927 kViruses|oCaudovirales|fSiphoviridae|sArchaeal_BJ1_virus
6928 kViruses|oCaudovirales|fSiphoviridae|sMycobacterium_phage_Sparky
6929 kViruses|oCaudovirales|fSiphoviridae|sRhodococcus_phage_REQ2
6930 kViruses|oCaudovirales|fSiphoviridae|sGordonia_phage_Phinally
6931 kViruses|oCaudovirales|fSiphoviridae|sCaulobacter_phage_CcrColossus
6932 kViruses|oCaudovirales|fSiphoviridae|sGordonia_phage_GTE8
`
判断red_S的第一列是否含我想要的内容:
library(dplyr)
library(stringr)
flt_sp <- as.data.frame(str_detect(res_S[,1],"p__"))
flt_sc <- as.data.frame(str_detect(res_S[,1],"c__"))
flt_so <- as.data.frame(str_detect(res_S[,1],"o__"))
flt_sf <- as.data.frame(str_detect(res_S[,1],"f__"))
flt_sg <- as.data.frame(str_detect(res_S[,1],"g__"))
根据上述判断条件来增加res_S的内容:
for (i in 1:nrow(res_S)) {
if(flt_sp[i,1]=="FALSE"&&flt_sc[i,1]=="FALSE"&&flt_so[i,1]=="FALSE"&&flt_sf[i,1]=="FALSE"&&flt_sg[i,1]=="FALSE"){
sgs <- res_S[i,1]
res_S[i,1]=gsub("s__","1__22|a__155|b__n5e|g__uu6", sgs)##这里没问题
}else if(flt_sp[i,1]=="FALSE"&&flt_sc[i,1]=="FALSE"&&flt_so[i,1]=="TRUE"&&flt_sf[i,1]=="TRUE"&&flt_sg[i,1]=="FALSE"){
sgs <- res_S[i,1]
res_S[i,1]=gsub("o__","p__op|y__noname666|o__", sgs)###疑问1
res_S[i,1]=gsub("s__","gofw123t__noname|s__" ,sgs)###疑问2
}else {
res_S[i,1]=res_S[i,1]
}
}
结果发现,“###疑问2”更改了res_S对应的内容,但“###疑问1”这里没有起到作用,我把“###疑问2"这行代码删掉,然后“###疑问1”是可以更改res_S对应的内容,对比“###疑问0”,下面的“###疑问1”和“###疑问2”多了一行循环内容,我目前想到的办法是先执行“###疑问1”,然后再写另一个for循环执行“###疑问2”,我感觉这样很笨并且啰嗦,还请老师们给出个招,谢谢。