2012-02-06 79 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