我试图在文件中找到基于两列的连续行的区域。我想找到最大的连续值范围。如果第4列(V3)紧接在第3行(V2)的第二行值之前,则将输出写入连续值的最长范围。
输入看起来像这样。输入:
> x
grp V1 V2 V3 V4 V5 V6
1: 1 DOG.1 142 144 132 134 0
2: 2 DOG.1 313 315 303 305 0
3: 3 DOG.1 316 318 306 308 0
4: 4 DOG.1 319 321 309 311 0
5: 5 DOG.1 322 324 312 314 0
输出应如下所示:
out.name in out
[1,] "DOG.1" "313" "324"
注意x [1,]是如何被移除的以及输出如何从x [2,3]开始并以x [5,4]结束。所有这些值都是连续的。
答案 0 :(得分:2)
一种显而易见的方法是取tail(x$V2, -1L) - head(x$V3, -1L)
并获得与最大连续1
对应的开始和结束索引。但是我会在这里跳过它(并留给其他人),因为我想在IRanges
package的帮助下展示如何做到这一点:
require(data.table)
require(IRanges) ## Bioconductor package
x.ir = reduce(IRanges(x$V2, x$V3))
max.idx = which.max(width(x.ir))
ans = data.table(out.name = "DOG.1",
in = start(x.ir)[max.idx],
out = end(x.ir)[max.idx])
# out.name bla out
# 1: DOG.1 313 324