我想使用三个非数字变量的条件语句加入两个数据框。这是我想要实现的伪代码版本。
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$ref
或input$alt
匹配。 rsid
和chrom
列将始终匹配。
我知道我可以在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 +行的数据帧。有更好的解决方案吗?
答案 0 :(得分:2)
复杂的连接在SQL中很简单:
library(sqldf)
sqldf("select *
from variant_index v
join input i on i.assessed = v.ref or i.assessed = v.alt")