いくつかの値が満たされた場合、文字列出力をリストに生成したいと思います。次のようなテーブルがあります。
grp V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17
1: 1 go.1 142 144 132 134 0 31 11 F D T hy al qe 34 6 3
2: 2 go.1 313 315 303 305 0 31 11 q z t hr ye er 29 20 41
3: 3 go.1 316 318 306 308 0 31 11 f w y hu er es 64 43 19
4: 4 go.1 319 321 309 311 0 31 11 r a y ie uu qr 26 22 20
5: 5 go.1 322 324 312 314 0 31 11 g w y hp yu re 44 7 0
この関数を使用して、目的の出力を生成しています。
library(IRanges); library(data.table)
rangeFinder = function(x){
x.ir = reduce(IRanges(x$V2, x$V3))
max.idx = which.max(width(x.ir))
ans = data.table(out = x[1,1],
start = start(x.ir)[max.idx],
end = end(x.ir)[max.idx])
return(ans)}
rangeFinder(x.out)
out start end
1: 1 313 324
また、rangeFinder からの開始出力と終了出力の間の文字 (列 V9-V11 から) を含むリストを生成したいと思います。
たとえば、出力は次のようになります。
out
[[go.1]]
[1] "qztfwyraygwy"
rangeFinder は、V2 列と V3 列の値を見て、最も長く一致する数値を出力します。rangeFinder が 313-324 から (142-324 からではなく) 出力を生成したにもかかわらず、"FDT" がリスト出力に含まれていないことに注意してください。どうすれば目的の出力を得ることができますか?