如果满足某些值,我想生成一个字符串输出到列表中。我有一张看起来像这样的表:
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列中的值并打印最长的数字匹配。请注意" FDT"即使rangeFinder从313-324(而不是142-324)产生输出,列表输出中也不包括该输出。如何获得所需的输出?
答案 0 :(得分:0)
reduce
有一个参数with.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的问题mailing list;无需订阅。
with.revmap
是最近增加的便利论点;我想
h = findOverlaps(ir, r)
i = queryHits(h)[subjectHits(h) == which.max(width(r))]
是替代品。