R 高效地查找向量中的相邻值
我有一个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
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))
}