我有一个如下所示的数据集:
Gene Sample Mutation Count BRAF ER5 WT 1 BRAF ES1 WT 1 BRAF ES2 p.V600E 4 BRAF ES2 WT 1 BRAF FRO p.V600E 3 BRAF FRO WT 1 TP53 HMVII p.G469V 1 TP53 HMVII WT 4 TP53 hn15 WT 1 TP53 HN5 WT 2 TP53 HNS WT 1
我们感兴趣的是首先标记来自Gene和Sample(不是变异)的重复项,指出哪些是重复的,并指出哪个重复条目是最大值,哪个不是最大值(可以有多于2个重复)基于计数字段(如果它们相等,我们可以称之为'max')。
(单独列)中的第二条信息是捕获每个突变的数据的统计数据,这对于冗余条目是相同的。相应的输出数据如下所示:
Gene Sample Mutation Count Flag Tally BRAF ER5 WT 1 ok WT BRAF ES1 WT 1 ok WT BRAF ES2 p.V600E 4 dup, max p.V600E(4),WT(1) BRAF ES2 WT 1 dup, not-max p.V600E(4),WT(1) BRAF FRO p.V600E 3 dup, max p.V600E(3),WT(1) BRAF FRO WT 1 dup, not-max p.V600E(3),WT(1) TP53 HMVII p.G469V 1 dup, not-max p.G469V(1),WT(4) TP53 HMVII WT 4 dup, max p.G469V(1),WT(4) TP53 hn15 WT 1 ok WT TP53 HN5 WT 2 dup, max WT(2),WT(1) TP53 HNS WT 1 dup, not-max WT(2),WT(1)
任何想法如何最好地解决这个问题?我认为ddply会是最好的,但不确定。
答案 0 :(得分:1)
我认为plyr
和base::merge()
的组合。我的结果表看起来与你的不同,但我认为这是正确的,因为最后两个Sample
条目是不同的HN5和HNS?
g<-read.csv("g.csv")
require(plyr)
g.summarized<-ddply(g,
.(Gene,Sample),
summarise,
c=length(Mutation),
max=max(Count),
tally=paste0(paste0(Mutation,"(",Count,")"),collapse=","))
g.new<-merge(g,
g.summarized,
by=c("Gene","Sample"),all=TRUE)
getFlag<-function(Count,c,max){
max<-ifelse(Count==max,"max","not-max")
ok<-ifelse(c==1,"ok",paste0("dup, ",max))
return(ok)
}
ddply(g.new,
.(Gene,Sample,Mutation),
summarise,
Count=Count,
Flag=getFlag(Count,c,max),
Tally=tally)
Gene Sample Mutation Count Flag Tally
1 BRAF ER5 WT 1 ok WT(1)
2 BRAF ES1 WT 1 ok WT(1)
3 BRAF ES2 p.V600E 4 dup, max p.V600E(4),WT(1)
4 BRAF ES2 WT 1 dup, not-max p.V600E(4),WT(1)
5 BRAF FRO p.V600E 3 dup, max p.V600E(3),WT(1)
6 BRAF FRO WT 1 dup, not-max p.V600E(3),WT(1)
7 TP53 HMVII p.G469V 1 dup, not-max p.G469V(1),WT(4)
8 TP53 HMVII WT 4 dup, max p.G469V(1),WT(4)
9 TP53 hn15 WT 1 ok WT(1)
10 TP53 HN5 WT 2 ok WT(2)
11 TP53 HNS WT 1 ok WT(1)