从三个输入 table 中生成需要列的 table
Produce table requiring columns from three input tables
我在 R
和 MySQL
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”和“将 genes
和 disease
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 中,filter
ing 适用于行。 select
是仅包含特定列的命令。如果您只需要一些输出列,则无法避免使用 select
命令。
我在 R
和 MySQL
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”和“将 genes
和 disease
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 中,filter
ing 适用于行。 select
是仅包含特定列的命令。如果您只需要一些输出列,则无法避免使用 select
命令。