2012-02-06 80 views
1

考虑以下的数据帧合并两个长度不同的数据帧:通过更新信息

> 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 $ names.counts值更新tot.final $ names.counts元件plusa $序列。

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

+0

问题 - 为'names.id = 4'和'序列='TTATCAGACTGATGTTGA''在'plusa',该行'tot.final'你应该添加它,因为它们似乎都具有相同的序列?你是否想要从'plusa'存储新的'names.id','st','end','width.reads'等等,或者只更新'names.counts'? – 2012-02-06 04:08:28

+0

names.id不计数,它是一个序列id,它与plusa中的序列id不对应。 ;我只想存储新的names.counts – agatha 2012-02-06 04:16:17

+0

对不起,我误解了一个序列。所以,如果你在'plusa'中有一行'TAGCTTATCAGACTGATGT',那么你想添加哪一行'tot.final'(因为前4个都有相同的序列)?或者你只是想要一个新的数据框'序列'和'计数',其中'TTATCAGACTGATGTTGA''计数'是1505 + 46 + 26 + 23 +无论'plusa'中的任何匹配? – 2012-02-06 04:17:53

回答

0

至于我能理解,我认为这是你想要做什么:

  1. 连接(比如rbind)plusatot.final
  2. 在这个数据帧中的每个独特的序列: 总结计数列。

在这种情况下,您可以使用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 

注意ddply(dataframe,.(sequence),FUNCTION)意味着:

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)) 
+0

和魔法发生......它工作得很好。显然ddply做了多个子集不能做的事情,在我的情况下..cheers! – agatha 2012-02-06 04:41:30