2012-02-06 3 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) 

Я хотел бы обновить tot.final $ names.counts элементов путем сложения значений plusa $ names.counts из соответствующих plusa $ последовательность.

Есть ли возможность объединить их таким образом, учитывая поле «sequence» как id?

+0

Вопрос - для 'names.id = 4' и' последовательность '= TTATCAGACTGATGTTGA'' в файле 'plusa', что строка в' tot.final' вы должны добавьте его, поскольку все они, похоже, имеют одну и ту же последовательность? И вы хотите сохранить новые значения 'names.id',' st', 'end',' width.reads' и т. Д. Из 'plusa' или обновить только' names.counts'? –

+0

names.id не учитывается, это идентификатор последовательности, который не соответствует идентификатору последовательности в плюсе. ; Я хочу только сохранить новые имена.counts – agatha

+0

urgh sorry Я неправильно читаю последовательность. Итак, если у вас есть строка в 'plusa' с последовательностью« TAGCTTATCAGACTGATGT », в какую строку« tot.final »вы хотите добавить ее (поскольку первые 4 имеют одну и ту же последовательность)? Или вам просто нужен новый кадр данных с «sequence» и «counts», где «counts» для «TTATCAGACTGATGTTGA» составляет 1505 + 46 + 26 + 23 + все, что соответствует «плюсе»? –

ответ

0

Насколько я могу понять, я думаю, что это то, что вы хотите сделать:

  1. присоединиться (скажем rbind) plusa к tot.final
  2. для каждой уникальной последовательности в этом кадре данных: сумму до столбцы counts.

В этом случае вы можете использовать библиотеку 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 делает то, что несколько подмножеств не может сделать, в моем случае .. чешеры! – agatha