2016-01-20 77 views
2

我有一些数据,我试图在dplyr中过滤,但我似乎无法让代码正确地完成它。这里有两组数据:在dplyr范围内选择记录

df1 <- data.frame(Chromosome = c("chr1", "chr1", "chr2", "chr3", "chr4"), 
        Position = c(5 ,12, 20, 25, 50), stringsAsFactors = FALSE) 

> df1 
    Chromosome Position 
1  chr1  5 
2  chr1  12 
3  chr2  20 
4  chr3  25 
5  chr4  50 

df2 <- data.frame(Chromosome = c("chr1", "chr3"), From = c(1, 20), 
        To = c(10, 80),stringsAsFactors = FALSE) 

> df2 
    Chromosome From To 
1  chr1 1 10 
2  chr3 20 80 

我希望做的是从第一个表中的行,其中染色体数目是被包含的“从”表和位置之间相同的,而“要“在第二张表中。所以这里的输出将是:

Chromosome Position 
1  chr1  5 
2  chr3  25 

有关如何在R中编写此任何建议?特别是我喜欢使用dplyr函数,但不是必需的。

+3

@DavidArenburg,我不这么认为。我认为,我们正在谈论[this](http://stackoverflow.com/a/25655497/559784).. :-) – Arun

回答

1
library(dplyr) 
left_join(df1, df2) %>% 
    filter(Position > From, Position < To) %>% 
    select(-From, -To) 

    Chromosome Position 
1  chr1  5 
2  chr3  25 

这是假设与来自和你data.frame的Chromosome没有重复的值。

+0

感谢您的建议,每个人。确实有重复的染色体值,但如果我使用inner_join而不是上面的left_join,它似乎工作得很好。中间文件的大小是巨大的。我还会在上面引用的线程中使用一些data.table“foverlap”函数。 – Steven

0

如果你是开放的data.table一个方法是

library(data.table) 
setDT(df1, key="Chromosome") 
setDT(df2, key="Chromosome") 

df1[ df2, { idx = i.From <= Position & Position <= i.To 
       .(Position = Position[idx]) 
      }, 
    by=.EACHI 
    ] 

# Chromosome Position 
#1:  chr1  5 
#2:  chr3  25 

通过this answer启发,我的前一个问题