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,是否有可能以这种方式合并它们?据我所知,我认为这就是您想要做的:
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) )