更改列数据框的某些行的值:分类表

时间:2015-03-25 17:47:59

标签: r replace dataframe

我有一个分类表(数据框),由许多细菌观察组成,分配到不同的分类学水平(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" 没有成功。

2 个答案:

答案 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="." ) )