我有一个包含sampleID,染色体,开始和停止以及meancol得分的数据框。我想折叠数据帧,因此对于每个可能的start.pos和stop.pos组合,每个chrom给出了所有sampleID的sum meancol得分。
输入:
sampleID chrom start.pos end.pos meancol
1.1 0012102_A01 1 0 11194349 1
1.4 0012102_A01 1 11194349 11492125 0
1.5 0012102_A01 1 11492125 71442329 1
1.9 0012102_A01 1 71442329 249250621 1
1.13 0012102_A02 1 0 65493011 1
1.92 0012102_A02 1 65493011 66164733 1
1.102 0012102_A02 1 66164733 121347754 1
1.52 0012102_A02 1 121347754 249250621 0
1.14 0012102_A03 1 0 56384956 1
1.83 0012102_A03 1 56384956 106266297 1
1.73 0012102_A03 1 106266297 249250621 0
1.15 0012102_A04 1 0 51484139 1
1.27 0012102_A04 1 51484139 249250621 0
2.1 0012102_A01 2 0 50000001 1
2.2 0012102_A01 2 50000001 250000001 1
2.3 0012102_A02 2 0 50000001 0
2.7 0012102_A02 2 50000020 270000001 0
2.18 0012102_A03 2 0 50000004 0
2.19 0012102_A03 2 50000004 250000001 0
1.15 0012102_A04 2 0 51484139 0
1.27 0012102_A04 2 51484139 249250621 0
输出:此处为每个染色体的所有可能的start.pos和end.pos组合添加了每个sampleID的所有平均分数。
chrom start.pos end.pos meancol
1 0 11194349 4
1 11194349 11492125 3
1 11492125 51484139 4
1 51484139 56384956 3
1 56384956 65493011 3
1 65493011 66164733 1
1 66164733 71442329 3
1 71442329 106266297 2
1 106266297 121347754 1
1 121347754 249250621 1
2 0 50000001 1
2 50000001 50000004 0
2 50000004 50000020 0
2 50000004 51484139 0
2 51484139 249250621 0
2 249250621 250000001 0
例如第一行输入:
sampleID chrom start.pos end.pos meancol
1.1 0012102_A01 1 0 11194349 1
该区域的输出给出了所有sampleID的总分:
chrom start.pos end.pos meancol
1 0 11194349 4
答案 0 :(得分:2)
我并不完全清楚你的“重叠”标准是什么。您在评论中指出,对于染色体1,范围(0,11194349)
出现在四行中:1.1,1.13,1.14和11.15。很公平。但是你断言范围(65493011,66164733)
只出现一次。然而,这个范围显示在行中:1.5,1.92,1.83和1.27(对于sum(meancol)=3
)。所以要么我不理解你的标准,要么你的例子有错误。
假设后者,这是在foverlaps(...)
包中使用data.table
的方法(> = 1.9.4)。
library(data.table) # requires version 1.9.4+
DT <- as.data.table(df) # assumes your data in df
setkey(DT,chrom,start.pos,end.pos)
limits <- DT[,list(start=head(sort(unique(c(start.pos,end.pos))),-1),
end =tail(sort(unique(c(start.pos,end.pos))),-1)),
by=chrom]
setkey(limits,chrom,start,end)
indx <- foverlaps(limits,DT,type="within")
indx[,list(meancol=sum(meancol)),by=list(chrom,start,end)]
# chrom start end meancol
# 1: 1 0 11194349 4
# 2: 1 11194349 11492125 3
# 3: 1 11492125 51484139 4
# 4: 1 51484139 56384956 3
# 5: 1 56384956 65493011 3
# 6: 1 65493011 66164733 3
# 7: 1 66164733 71442329 3
# 8: 1 71442329 106266297 3
# 9: 1 106266297 121347754 2
# 10: 1 121347754 249250621 1
# 11: 2 0 50000001 1
# 12: 2 50000001 50000004 1
# 13: 2 50000004 50000020 1
# 14: 2 50000020 51484139 1
# 15: 2 51484139 249250621 1
# 16: 2 249250621 250000001 1
# 17: 2 250000001 270000001 0
答案 1 :(得分:1)
我会检查IRanges包并使用findOverlaps。
# read table into chrx and split by chr
y <-split(chrx, chrx$chrom)
# for each chr, get ranges (could run loop?)
x <- y[[1]]
z<- IRanges(x[,3], x[,4])
# find overlaps where query is within another range (incl. self)
x1 <- as.data.frame(findOverlaps(z, type="within"))
# add columns for easier grouping
x1$chr <- x$chr[x1[,1]]
x1$start <- x$start.pos[x1[,1]]
x1$end <- x$end.pos[x1[,1]]
x1$mean <- x$meancol[x1[,2]]
x1
queryHits subjectHits chr start end mean
1 1 1 1 0 11194349 1
2 1 5 1 0 11194349 1
3 1 9 1 0 11194349 1
4 1 12 1 0 11194349 1
5 2 2 1 11194349 11492125 0
6 2 5 1 11194349 11492125 1
7 2 9 1 11194349 11492125 1
8 2 12 1 11194349 11492125 1
9 3 3 1 11492125 71442329 1
10 4 4 1 71442329 249250621 1
11 4 13 1 71442329 249250621 0
12 5 5 1 0 65493011 1
aggregate(list(sum=x1$mean), x1[,3:5], sum)
chr start end sum
1 1 0 11194349 4
2 1 11194349 11492125 3
3 1 0 51484139 3
4 1 0 56384956 2
5 1 0 65493011 1
6 1 65493011 66164733 3
7 1 11492125 71442329 1
8 1 56384956 106266297 1
9 1 66164733 121347754 1
10 1 51484139 249250621 0
11 1 71442329 249250621 1
12 1 106266297 249250621 1
13 1 121347754 249250621 1