4

我有一个 R 数据框,其中包含一个表示染色体位置的数字向量和一个基因名称向量。我还有一个该染色体上有趣元素的起始位置向量。我想提取每个元素上方和下方的 3 个最接近基因的名称和位置,我想知道最有效的方法。

例如:

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
4

2 回答 2

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根据您的偏好调整行为。

于 2013-04-16T18:22:36.627 回答
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))
}
于 2013-04-16T18:32:52.620 回答