从三个输入 table 中生成需要列的 table

Produce table requiring columns from three input tables

我在 RMySQL table 一起工作。我可以使用 SQL 查询来做我需要的事情,但我想知道我是否可以使用 dbplyr 来获得“一致”的代码(我后来用它来制作更多过滤器)

我说的“tables”是 MySQL tables 我和 RMariaDB.

一起工作

我有两个 table:

> genes <- data.frame(geneid = c(1:3), thing1 = c("a","b","c"), thing2 = c("d", "f", "g"))
> genes
  geneid thing1 thing2
1      1      a      d
2      2      b      f
3      3      c      g

> diseases <- data.frame(diseaseid = c(4:6), thing3 = c("a","b","c"), thing4 = c("d", "f", "g"))
> diseases
  diseaseid thing3 thing4
1         4      a      d
2         5      b      f
3         6      c      g

现在,我有第三个,其中两列是此 tables:

中的键
> gd <- data.frame(gd = c(7:9), geneid = c(1:3), diseaseid = c(4:6), thing5 = c("dd2d", "f2ff", "g2gg"))
> gd
  gd geneid diseaseid thing5
1  7      1         4   dd2d
2  8      2         5   f2ff
3  9      3         6   g2gg

我想通过使用“geneid”和“将 genesdisease table 连接到 gd 来创建输出 table疾病”列。输出 table 应包含三列:“thing1”、“thing4”、“thing5”。

> new_gd
  thing1 thing4 thing5
1      a    ddd   dd2d
2      b    fff   f2ff
3      c    ggg   g2gg

我可以用这个 SQL 查询(有点)来做到这一点:

select gd.*, g.thing1, d.thing4
from gene_disease as gd
left join genes as g
on gd.geneid = g.geneid
left join diseases as d
on gd.diseaseid = d.diseaseid

但我仍然必须从原来的两个 table 中过滤掉我不想看到的其他列。有没有办法在 dbplyr 中完成这一切,即使我有两个 make 2“行”(我知道 dbplyr 不能连接超过两个 table) .

我不确定您是从哪里了解到 dbplyr 不能连接两个以上的表的。我们可以使用 dbplyr 以与在 R 中相同的方式执行此操作:通过指定多个连接。

我会按如下方式处理这个问题:

# connect to database
db_con = DBI::dbConnect( your_database_connection_details_here )
# connect to tables
remote_genes = dplyr::tbl(db_con, from = "genes")
remote_disease = dplyr::tbl(db_con, from = "disease")
remote_gd = dplyr::tbl(db_con, from = "gd")

# combine
remote_new_gd = remote_gd %>%
  left_join(remote_genes, by = "geneid") %>%
  left_join(remote_diseases, by = "diseaseid") %>%
  select(thing1, thing4, thing5)

这里的关键是我们对所有三个表使用相同的数据库连接。如果表位于不同的数据库中,您可能需要 fiddle 使用 dplyr::tbl(db_con, ... 命令来包含数据库名称。

可能的术语混淆:在 dplyr 中,filtering 适用于行。 select 是仅包含特定列的命令。如果您只需要一些输出列,则无法避免使用 select 命令。