2013-04-16 34 views
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 
+0

當你說最近的3,你的意思是包含元素,那麼無論是3上面和下面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取決於您的偏好。

+0

+1我正在用'findInterval'進行這些操作,但是我正在考慮是否應該根據基因的起始位置在哪裏切換idx-2/idx + 3 –

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

這個答案對我來說似乎更好一些)它發現「最接近的基因」('findInterval(99,c(1,10,100))'給出2,而我們想要3,因爲99最接近100)。 2)它解決了陣列邊緣的問題。小點;預先計算abs(基因[,1] -x)而不是表達兩次是否更有效/可讀? –

+0

你說得對。預先計算絕對差異可能更有效。我只想保留我的解決方案三行... –