2014-04-10 76 views
1

我試圖在基於兩列的連續行的文件中查找區域。我想找到連續值的最大跨度。如果列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]。所有這些值都是連續的。

回答

2

一個顯而易見的方法是取tail(x$V2, -1L) - head(x$V3, -1L)並獲取對應於最大連續1 s的開始和結束索引。但我會在這裏跳過它(並將其留給其他人),因爲我想說明如何在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