R 通过更新信息合并两个长度不同的数据帧

R 通过更新信息合并两个长度不同的数据帧,r,dataframe,R,Dataframe,考虑到以下数据帧: > tail(tot.final) names.id sequence names.reads width.reads names.counts st end flag 819 125546 TAGCTTATATGACTGATGTTGACA 125546-4 24 4 8 31 TRUE 820 218783 TCGCTTATCAGACTGATGTTGAAA 2

考虑到以下数据帧:

 > tail(tot.final)
   names.id                  sequence names.reads width.reads names.counts st end flag
819   125546  TAGCTTATATGACTGATGTTGACA    125546-4          24            4  8  31 TRUE
820   218783  TCGCTTATCAGACTGATGTTGAAA    218783-2          24            2  8  31 TRUE
821   272992  CAGCTTATCAGACTGATGTTGAAA    272992-2          24            2  8  31 TRUE
822   135191 TAGCTTATCAGACTGATGTTGAACA    135191-4          25            4  8  32 TRUE
823   278047 TAGCTTATCAGACTGATGTTGAAGA    278047-2          25            2  8  32 TRUE
824   317980 TAGCTTATCAGACTGATGTTGCCCT    317980-2          25            2  8  32 TRUE

head(plusa)
  names.id            sequence names.reads width.reads names.counts st end flag
2     28092   ATCAGACTGATGTTGAC    28092-29          17           29 14  30 TRUE
4     65308  TTATCAGACTGATGTTGA    65308-10          18           10 12  29 TRUE
6     71226  TATCAGACTGATGTTGAC     71226-9          18            9 13  30 TRUE

> nrow(tot.final)
[1] 824
> nrow(plusa)
[1] 421

plusa contains 451 rows with a  common plusa$sequence column. (not sorted)
我想通过添加相应plusa$序列的plusa$names.counts值来更新tot.final$names.counts元素


考虑到“序列”字段作为id,是否有可能以这种方式合并它们?

据我所知,我认为这就是您想要做的:

  • 加入(说rbind)
    plusa
    tot.final
  • 对于此数据帧中的每个唯一序列: 汇总计数列
  • 在这种情况下,您可以使用
    plyr
    库。我举了一个例子来说明,你应该能够使它适应你的:

    library(plyr)
    df.final <- data.frame(sequence=c('A','B','C','D'),
                           counts=c(100,123,234,200),
                           stringsAsFactors=F)
    #   sequence counts
    # 1        A    100
    # 2        B    123
    # 3        C    234
    # 4        D    200
    
    df.plusa <- data.frame(sequence=c('A','E','C','F'),
                           counts=c(10,20,30,40),
                           stringsAsFactors=F)
    #   sequence counts
    # 1        A     10
    # 2        E     20
    # 3        C     30
    # 4        F     40
    
    # rbind together and do the counts:
    df.final.aggregated <- ddply(rbind(df.final,df.plusa),
                                 .(sequence),
                                 summarise,
                                 counts=sum(counts))
    #   sequence counts
    # 1        A    110
    # 2        B    123
    # 3        C    264
    # 4        D    200
    # 5        E     20
    # 6        F     40
    
    对于您的特定数据,这可能会起作用(因为我没有您的数据,所以未进行测试):


    问题——对于
    plusa
    中的
    names.id=4
    sequence='TTATCAGACTGATGTGA'
    ,您应该将其添加到
    tot.final
    中的哪一行,因为它们似乎都具有相同的序列?您想从
    plusa
    存储新的
    名称.id
    st
    end
    width.reads
    等值,还是只更新
    名称.counts
    计数?name.id不计数,它是与plusa中的序列id不对应的序列id;我只想储存新名字。对不起,我误读了一个序列。因此,如果您在
    plusa
    中有一行具有序列“TAGCTTATCAGACTGATGT”,您希望将其添加到
    tot.final
    中的哪一行(因为前4行都具有相同的序列)?或者您只是想要一个带有“序列”和“计数”的新数据帧,其中“TTATCAGACTGATGTTGA”的“计数”是1505+46+26+23+在
    plusa
    中匹配的任何值?好的,所以tot.final包含plusa中的421个序列..未排序,但它们都在那里…因此每当在plusa中找到对应的tot.final序列时,names.counts字段已更新抱歉,不,它包含不同的序列。我已经更新了我的问题和魔术发生了…它的工作非常好。显然,ddply做了多个子集做不到的事情,在我的情况下..干杯!
    for each unique seq in dataframe$sequence:
        do FUNCTION( dataframe[ dataframe$sequence==seq, ] )
        merge them all back into one big dataframe.
    
    ddply( rbind(tot.final,plusa), .(sequence), summarise,
           names.counts = sum(names.counts) )