左连接两个具有OR条件的R数据帧

时间:2019-10-18 12:28:44

标签: r dataframe join dplyr

问题

我想使用三个非数字变量的条件语句加入两个数据框。这是我想要实现的伪代码版本。

Join DF1 and DF2 on DF1$A == DF2$A | DF1$A == DF2$B

数据集

这里有一些代码可以创建两个数据框。 variant_index是将用于使用input注释left_join的数据帧:

library(dplyr)
options(stringsAsFactors = FALSE)

set.seed(5)
variant_index <- data.frame(
  rsid   = rep(sapply(1:5, function(x) paste0(c("rs", sample(0:9, 8, replace = TRUE)), collapse = "")), each = 2),
  chrom  = rep(sample(1:22, 5), each = 2),
  ref    = rep(sample(c("A", "T", "C", "G"), 5, replace = TRUE), each = 2),
  alt    = sample(c("A", "T", "C", "G"), 10, replace = TRUE),
  eaf    = runif(10),
  stringAsFactors = FALSE
)
variant_index[1, "alt"] <- "T"
variant_index[8, "alt"] <- "A"

input <- variant_index[seq(1, 10, 2), ] %>%
  select(rsid, chrom)
input$assessed <- c("G", "C", "T", "A", "T")

我尝试过的

我想在left_join上执行input,以对eaf中的variant_index列进行注释。从input数据框中可以看到,其assessed列可以与input$refinput$alt匹配。 rsidchrom列将始终匹配。

我知道我可以在by的{​​{1}}参数中指定多个列,但是如果我理解正确,条件将始终为

left_join

我想实现的目标

input$assessed == variant_index$ref & input$assessed == variant_index$alt

可能的解决方案

可以这样获得所需的输出:

input$assessed == variant_index$ref | input$assessed == variant_index$alt

但这对我来说似乎不是最佳的解决方案,因为我可能会生成双行,并且希望将此联接应用于包含100M +行的数据帧。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

复杂的连接在SQL中很简单:

library(sqldf)

sqldf("select *
  from variant_index v
  join input i on i.assessed = v.ref or i.assessed = v.alt")