2014-12-23 32 views
3

我有兩個數據幀,並希望使用一個(DF1$pos)中的值來搜索DF2(DF2start,DF2end)中的兩列,並且如果它落在這些數字中,則返回DF2$name在範圍內的數據幀查找值並返回不同列

DF1

ID pos name 
chr 12 
chr 542 
chr 674 

DF2

ID start end annot 
chr  1 200  a1 
chr 201 432  a2 
chr 540 1002  a3 
chr 2000 2004  a4 

所以在這個例子中,我想DF1成爲

ID pos name 
chr 12 a1 
chr 542 a3 
chr 674 a3 

我已經使用合併和相交,但不知道如何使用if聲明與他們的邏輯表達式嘗試。

的數據幀應如下編碼,

DF1 <- data.frame(ID=c("chr","chr","chr"), 
       pos=c(12,542,672), 
       name=c(NA,NA,NA)) 

DF2 <- data.frame(ID=c("chr","chr","chr","chr"), 
       start=c(1,201,540,200), 
       end=c(200,432,1002,2004), 
       annot=c("a1","a2","a3","a4")) 
+0

我沒有投下這個問題,但我認爲無論誰這麼做都是因爲你沒有把你的數據拼湊起來R在R格式 – user1945827

回答

5

也許你可以使用從「data.table」包foverlaps

library(data.table) 
DT1 <- data.table(DF1) 
DT2 <- data.table(DF2) 
setkey(DT2, ID, start, end) 
DT1[, c("start", "end") := pos] ## I don't know if there's a way around this step... 
foverlaps(DT1, DT2) 
#  ID start end annot pos i.start i.end 
# 1: chr  1 200 a1 12  12 12 
# 2: chr 540 1002 a3 542  542 542 
# 3: chr 540 1002 a3 674  674 674 
foverlaps(DT1, DT2)[, c("ID", "pos", "annot"), with = FALSE] 
#  ID pos annot 
# 1: chr 12 a1 
# 2: chr 542 a3 
# 3: chr 674 a3 

正如意見中提到的@Arun,你也可以使用which = TRUEfoverlaps提取相關的值:

foverlaps(DT1, DT2, which = TRUE) 
# xid yid 
# 1: 1 1 
# 2: 2 3 
# 3: 3 3 
DT2$annot[foverlaps(DT1, DT2, which = TRUE)$yid] 
# [1] "a1" "a3" "a3" 
+0

謝謝阿南達,這是一種魅力。非常感激。 – ScienceBuff

+0

@阿倫會不會有'dplyr'的方式來達到這個目的呢? –

+0

@StevenBeaupré,沒有重疊連接,但是使用'between()' - 檢查[這篇文章](http://stackoverflow.com/a/24480301/559784)。它實現了整個連接,然後過濾。 – Arun

2

你也可以使用IRanges

source("http://bioconductor.org/biocLite.R") 
biocLite("IRanges") 
library(IRanges) 
DF1N <- with(DF1, IRanges(pos, pos)) 
DF2N <- with(DF2, IRanges(start, end)) 
DF1$name <- DF2$annot[subjectHits(findOverlaps(DF1N, DF2N))] 
DF1 
# ID pos name 
#1 chr 12 a1 
#2 chr 542 a3 
#3 chr 674 a3 
+1

不錯。儘管使用'GenomicRanges'包可能更具相關性,因爲'IRanges'只處理範圍(沒有標識符)。或者你必須使用我認爲的RangesList,但是GRanges更方便。 Q表示只有一個染色體,但我懷疑它是真實數據集中的情況。 – Arun

+0

@Arun感謝您的信息。我沒有安裝「GenomicRanges」。將檢查它。 – akrun

+0

@Arun你可以添加一個單獨的答案嗎? – akrun

相關問題