在向量中有效地找到相邻值

时间:2013-04-16 18:11:14

标签: r vector

我有一个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

2 个答案:

答案 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))
}