选择dplyr中范围内的记录

时间:2016-01-20 14:15:50

标签: r 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

我想要做的是从第一个表格中选择那些表格之间染色体编号相同的行,并且位置包含在第二个表格中的“From”和“To”之间。所以这里的输出是:

  Chromosome Position
1       chr1        5
2       chr3       25

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

2 个答案:

答案 0 :(得分:3)

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的重复值,包含From和To。

答案 1 :(得分: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的启发,前一个我的问题

相关问题