1

いくつかの値が満たされた場合、文字列出力をリストに生成したいと思います。次のようなテーブルがあります。

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" がリスト出力に含まれていないことに注意してください。どうすれば目的の出力を得ることができますか?

4

1 に答える 1

0

reducewith.revmapオブジェクトに「メタデータ」列 ( でアクセス可能) を追加する引数がmcols()あります。これにより、縮小された各範囲に、縮小された範囲にマップされる元の範囲のインデックスがIntegerListクラスとして関連付けられます。基本的には、すべての要素が整数ベクトルであることが保証されているリストです。これらはあなたが興味を持っている行です

ir <- with(x, IRanges(V2, V3))
r <- reduce(ir, with.revmap=TRUE)
i <- unlist(mcols(r)[which.max(width(r)), "revmap"])

データ文字列は次のようなもので変更できます

j <- paste0("V", 9:11)
paste0(as.matrix(x[i, j, drop=FALSE]), collapse="")

Bioconductorメーリング リストで IRanges について質問することをお勧めします。サブスクリプションは必要ありません。

with.revmap比較的最近追加された便利な引数です。おもう

h = findOverlaps(ir, r)
i = queryHits(h)[subjectHits(h) == which.max(width(r))]

交換品です。

于 2014-04-15T12:40:03.430 に答える