我有一个分类表(数据框),由许多细菌观察组成,分配到不同的分类学水平(5个分类学水平的5列,称为等级)。有些观察没有完整的分配,这意味着缺少信息,这些观察需要填写分类学水平的字母和_。 我需要用字符串填充具有缺少信息的行。
我所拥有的一部分(等级5缺少信息):
tax_table_F[51:59,]
Rank1 Rank2 Rank3 Rank4 Rank5
214036 k__Bacteria p__Firmicutes c__Clostridia o__Clostridiales f__[Mogibacteriaceae]
968675 k__Bacteria p__Proteobacteria c__Gammaproteobacteria o__Pasteurellales f__Pasteurellaceae
121873 k__Bacteria p__Firmicutes c__Clostridia o__Clostridiales f__Dehalobacteriaceae
357046 k__Bacteria p__Bacteroidetes c__Bacteroidia o__Bacteroidales f__Rikenellaceae
302106 k__Bacteria p__Synergistetes c__Synergistia o__Synergistales f__Dethiosulfovibrionaceae
836693 k__Bacteria p__Firmicutes c__Clostridia o__SHA-98 f__
577170 k__Bacteria p__Bacteroidetes c__Bacteroidia o__Bacteroidales f__Bacteroidaceae
269386 k__Bacteria p__Cyanobacteria c__4C0d-2 o__YS2 f__
New.ReferenceOTU79 k__Bacteria p__Firmicutes c__Bacilli o__Lactobacillales f__Lactobacillaceae
我想要做的是将Rank5列中具有“f__”的Observations替换为Rank3,Rank4和Rank5列的数据串联。
我所做的是创建一个新的数据框tax_table_sF,对所有具有“f__”的观察(由rowname手动)进行子集化,并将Rank5数据替换为3列中的连接信息。
tax_table_sF<-tax_tableF[c(1887417 ,461487, 360268, 211720 , 467605, 290455, 836693 , 269386 , "OTU38251" ),] # generate the new data frame
tax_table_sF$Rank5<-paste(tax_table_sF$Rank3, tax_table_sF$Rank4, tax_table_sF$Rank5, sep=".") # replace "f__" with concatenated data
Rank1 Rank2 Rank3 Rank4
1887417 k__Bacteria p__TM7 c__TM7-3 o__
461487 k__Bacteria p__Firmicutes c__Clostridia o__Clostridiales
360268 k__Bacteria p__Tenericutes c__RF3 o__ML615J-28
211720 k__Bacteria p__Proteobacteria c__Alphaproteobacteria o__RF32
467605 k__Bacteria p__Cyanobacteria c__Chloroplast o__Streptophyta
290455 k__Bacteria p__Bacteroidetes c__Bacteroidia o__Bacteroidales
836693 k__Bacteria p__Firmicutes c__Clostridia o__SHA-98
269386 k__Bacteria p__Cyanobacteria c__4C0d-2 o__YS2
OTU38251 k__Bacteria p__Tenericutes c__Mollicutes o__RF39
Rank5
1887417 c__TM7-3.o__.f__
461487 c__Clostridia.o__Clostridiales.f__
360268 c__RF3.o__ML615J-28.f__
211720 c__Alphaproteobacteria.o__RF32.f__
467605 c__Chloroplast.o__Streptophyta.f__
290455 c__Bacteroidia.o__Bacteroidales.f__
836693 c__Clostridia.o__SHA-98.f__
269386 c__4C0d-2.o__YS2.f__
OTU38251 c__Mollicutes.o__RF39.f__
然后我试过了,
tax_table_F_mer<-merge(tax_table_F., tax_table_sF)
但我得到一个空数据框。我尝试添加by="Rank5"
或添加新列df$rowname<-rownames(df)
并添加by="rownames"
没有成功。
答案 0 :(得分:0)
这是一个快速的脏例子(我希望我明白你想要实现的目标):
tax_table_F[tax_table_F$Rank5=="f__",]$Rank5 <- cbind(paste(tax_table_F[tax_table_F$Rank5=="f__",]$Rank3,tax_table_F[tax_table_F$Rank5=="f__",]$Rank4,tax_table_F[tax_table_F$Rank5=="f__",]$Rank5,sep="."))
答案 1 :(得分:0)
与前一个相同的答案,但代码可能更具可读性
tax_table_F$Rank5 <- as.character(tax_table_F$Rank5) # as necessary, convert column from factor to character
f__rows <- tax_table_F$Rank5=="f__" # rows to be changed
tax_table_F$Rank5[f__rows ] <- with(tax_table_F[f__rows,], paste(Rank3, Rank4, Rank5, sep="." ) )