使用 OR 条件左连接两个 R 数据框

2024-03-31

Problem

我有两个数据框,我想使用三个非数字变量的条件语句来连接它们。这是我想要实现的伪代码版本。

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

Dataset

这是创建两个数据框的一些代码。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 on input来注释eaf专栏来自variant_index。正如你可以看到input数据框,其assessed列可以匹配input$ref或与input$alt. The rsid and chrom列将始终匹配。

我知道我可以在by的论证left_join,但如果我理解正确的话,条件总是

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

而我想实现

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

可能的解决方案

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

input %>% 
  left_join(variant_index) %>% 
  filter(assessed == ref | assessed == alt)

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


复杂的连接在 SQL 中是直接的:

library(sqldf)

sqldf("select *
  from variant_index v
  join input i on i.assessed = v.ref or i.assessed = v.alt")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OR 条件左连接两个 R 数据框 的相关文章

随机推荐