我有一个R数据框,其中的数字向量表示沿着染色体的位置和基因名称的向量。我还有一个有关该染色体上有趣元素起始位置的载体。我想提取每个元素上下三个最接近基因的名称和位置,我想知道最有效的方法。
例如:
genes <- data.frame("geneStart"=sort(sample(500,10)), "geneName"=sample(LETTERS,10))
genes
geneStart geneName
1 66 X
2 158 U
3 262 N
4 385 D
5 387 H
6 418 Z
7 464 J
8 469 Y
9 475 L
10 491 I
我想最终得到一个函数,我们称之为getAdjacent
,如下所示:
getAdjacent(280)
[1] "X" "U" "N" "D" "H" "Z"
getAdjacent(479)
[1] "J" "Y" "L" "I" NA NA
答案 0 :(得分:3)
使用findInterval
:
getAdjacent <- function(x) {
idx <- findInterval(x, genes$geneStart)
range.idx <- (idx-2):(idx+3)
range.idx <- ifelse(range.idx <= 0, NA, range.idx)
as.character(genes$geneName)[range.idx]
}
如果x
属于genes$geneStart
,则可能需要调整行为,具体取决于您的偏好。
答案 1 :(得分:2)
我的版本:
getAdjacent <-function(x){
ind <-which(abs(genes[,1]-x)==min(abs(genes[,1]-x))) #which row is closest
out <-genes[max(1,ind-3):min(nrow(genes),ind+2),2] #indexed for closest match
return(as.character(out))
}