簡體   English   中英

用 OR 條件左連接兩個 R 數據幀

[英]Left join two R data frames with OR conditions

問題

我有兩個數據框,我想在三個非數字變量上使用條件語句加入它們。 這是我想要實現的偽代碼版本。

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

數據集

這是創建兩個數據框的一些代碼。 variant_index是將用於使用left_join注釋input的數據框:

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")

我試過的

我想對input執行left_join以使用來自variant_indexeaf列進行注釋。 input數據框中可以看出,它的assessed列可以與input$refinput$alt匹配。 rsidchrom列將始終匹配。

我知道我可以在left_joinby參數中指定多個列,但如果我理解正確,條件將始終是

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

而我想實現

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

可能的解決方案

可以像這樣獲得所需的 output:

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")

嘗試這個

庫(dbplyr)x1 <- memdb_frame(x = 1:5)x2 <- memdb_frame(x1 = 1:3,x2 = 字母[1:3])x1 <- x1 %>% left_join(b,sql_on =“ax =b.x1 或 ax=b.x2") %>% show_query()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM