R 高效地查找向量中的相邻值

R 高效地查找向量中的相邻值,r,vector,R,Vector,我有一个R数据框,其中一个数字向量表示染色体上的位置,一个基因名向量。我还有一个向量,它是染色体上有趣元素的起始位置。我想提取每个元素上下三个最接近的基因的名称和位置,我想知道最有效的方法 例如: genes <- data.frame("geneStart"=sort(sample(500,10)), "geneName"=sample(LETTERS,10)) genes geneStart geneName 1 66 X 2 158

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

使用
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]
}
getnext我的版本:

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

getnextant当你说3最近时,你是指包含元素的基因,然后是上面3个和下面2个,还是相反?你是根据基因长度来决定的吗?+1我本来是按照这些思路来做的,但是我在考虑idx-2/idx+3是否应该根据基因的起始位置来切换。这个答案对我来说似乎更好,因为1)它找到了“最近的基因”(
findInterval(99,c(1,10100))
给出2,而我们想要3,因为99最接近100)。2)它解决了阵列边缘的问题。小结;如果预先计算abs(基因[,1]-x)
而不是两次得到表达式,不是更有效/可读吗?你是对的。预先计算绝对差异可能更有效。我只想将我的解决方案保留为三行。。。
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))
}