【问题标题】:selecting records within a range in dplyr在 dplyr 中选择一个范围内的记录
【发布时间】:2016-01-20 14:15:50
【问题描述】:

我有一些数据要在 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 函数,但不是必需的。

【问题讨论】:

  • @DavidArenburg,我不这么认为.. 我想我们在谈论this.. :-)

标签: r dplyr


【解决方案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 值以及 From 和 To。

【讨论】:

  • 谢谢大家的建议。 Chromosome 肯定有重复的值,但是如果我在上面使用 inner_join 而不是 left_join 它似乎工作得很好。中间文件的大小是巨大的。我还将在上面引用的线程上使用一些 data.table “foverlap”函数。
【解决方案2】:

如果您对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 的启发,我的上一个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多