滚动连接以查找基因组区域
rolling join to find genomic regions
简易版就是我想找到某个值一定距离内的所有匹配项。示例:
library(data.table)
reads <- structure(list(seqnames = c(1, 1, 1, 1, 1, 1, 1), start = c(100,
100, 100, 130, 130, 132, 133), end = c(130, 130, 131, 160, 160,
155, 160), strand = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "+", class = "factor")), row.names = c(NA,
-7L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x15af570>, sorted = c("start",
"end", "strand"))
# take only the end position
p3 <- reads[, list(N3 = .N), by = c("seqnames", "end", "strand")]
setnames(p3, "end", "loc.3p")
# take only the start position
p5 <- reads[, list(N5 = .N), by = c("seqnames", "start", "strand")]
setnames(p5, "start", "loc.5p")
# find the start positions close to the end positions
p3[, loc := loc.3p]
p5[, loc := loc.5p]
p3[p5, roll=50, rollends=c(FALSE, TRUE), nomatch=0, on = c("seqnames", "strand", "loc")]
seqnames loc.3p strand N3 loc loc.5p N5
1: 1 130 + 2 130 130 2
2: 1 131 + 1 132 132 1
3: 1 131 + 1 133 133 1
这有效,但只返回第一个匹配项。我现在的目标是找到所有匹配项(在指定的 50 个范围内)。预期输出:
seqnames loc.3p strand N3 loc loc.5p N5
1: 1 130 + 2 130 130 2
2: 1 130 + 2 130 132 1
3: 1 130 + 2 133 133 1
4: 1 131 + 1 132 132 1
4: 1 131 + 1 133 133 1
注意 loc.3p
130 也应该与 loc.5p
132 和 132 匹配。
怎么做?我需要保留下一组操作的分数。
生物信息学版本,我试图找到一定距离内(在同一链中)的所有下游 5' reads。对于这个例子,我只使用“+”链,但我也必须为“-”链做它。由于这将针对数百万次读取完成,因此 data.table
似乎是合适的。我查看了 GenomicRanges
但保留两组数据(5' 和 3' 位置)的元数据有点令人费解。
当你说
within the specified range of 50
这让我想到非平等加入。将来如果您显示您想要的结果可能会有所帮助:)
对 p3
稍作修改,注意我跳过了创建您拥有的 loc
列。
p3[, "upper" := 50 + loc.3p]
非等值连接:
p3[p5, .(seqnames, x.loc.3p, strand, N3, loc.5p, N5),
on = .(seqnames, strand, loc.3p <= loc.5p, upper >= loc.5p), nomatch = 0
][order(x.loc.3p, loc.5p),
.(seqnames, loc.3p = x.loc.3p, strand, N3, loc.5p, N5)
]
seqnames loc.3p strand N3 loc.5p N5
1: 1 130 + 2 130 2
2: 1 130 + 2 132 1
3: 1 130 + 2 133 1
4: 1 131 + 1 132 1
5: 1 131 + 1 133 1
最后一个括号用于排序和重命名,我不完全确定为什么我必须在第一个括号中指定 x.loc.3p
,但是没有它我得到了一个错误...
简易版就是我想找到某个值一定距离内的所有匹配项。示例:
library(data.table)
reads <- structure(list(seqnames = c(1, 1, 1, 1, 1, 1, 1), start = c(100,
100, 100, 130, 130, 132, 133), end = c(130, 130, 131, 160, 160,
155, 160), strand = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "+", class = "factor")), row.names = c(NA,
-7L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x15af570>, sorted = c("start",
"end", "strand"))
# take only the end position
p3 <- reads[, list(N3 = .N), by = c("seqnames", "end", "strand")]
setnames(p3, "end", "loc.3p")
# take only the start position
p5 <- reads[, list(N5 = .N), by = c("seqnames", "start", "strand")]
setnames(p5, "start", "loc.5p")
# find the start positions close to the end positions
p3[, loc := loc.3p]
p5[, loc := loc.5p]
p3[p5, roll=50, rollends=c(FALSE, TRUE), nomatch=0, on = c("seqnames", "strand", "loc")]
seqnames loc.3p strand N3 loc loc.5p N5
1: 1 130 + 2 130 130 2
2: 1 131 + 1 132 132 1
3: 1 131 + 1 133 133 1
这有效,但只返回第一个匹配项。我现在的目标是找到所有匹配项(在指定的 50 个范围内)。预期输出:
seqnames loc.3p strand N3 loc loc.5p N5
1: 1 130 + 2 130 130 2
2: 1 130 + 2 130 132 1
3: 1 130 + 2 133 133 1
4: 1 131 + 1 132 132 1
4: 1 131 + 1 133 133 1
注意 loc.3p
130 也应该与 loc.5p
132 和 132 匹配。
怎么做?我需要保留下一组操作的分数。
生物信息学版本,我试图找到一定距离内(在同一链中)的所有下游 5' reads。对于这个例子,我只使用“+”链,但我也必须为“-”链做它。由于这将针对数百万次读取完成,因此 data.table
似乎是合适的。我查看了 GenomicRanges
但保留两组数据(5' 和 3' 位置)的元数据有点令人费解。
当你说
within the specified range of 50
这让我想到非平等加入。将来如果您显示您想要的结果可能会有所帮助:)
对 p3
稍作修改,注意我跳过了创建您拥有的 loc
列。
p3[, "upper" := 50 + loc.3p]
非等值连接:
p3[p5, .(seqnames, x.loc.3p, strand, N3, loc.5p, N5),
on = .(seqnames, strand, loc.3p <= loc.5p, upper >= loc.5p), nomatch = 0
][order(x.loc.3p, loc.5p),
.(seqnames, loc.3p = x.loc.3p, strand, N3, loc.5p, N5)
]
seqnames loc.3p strand N3 loc.5p N5
1: 1 130 + 2 130 2
2: 1 130 + 2 132 1
3: 1 130 + 2 133 1
4: 1 131 + 1 132 1
5: 1 131 + 1 133 1
最后一个括号用于排序和重命名,我不完全确定为什么我必须在第一个括号中指定 x.loc.3p
,但是没有它我得到了一个错误...