【发布时间】:2020-04-17 21:00:07
【问题描述】:
library(data.table)
如果您在星型模式中有 3 个表。像这样的东西。我有一个虚拟表 dt1 取决于 dt2 和 dt3
dt1 <- data.table( x1 = 1:10, y1 = 11:20)
dt2 <- data.table( x2 = 1:10, y2 = letters[11:20])
dt3 <- data.table( x3 = letters[1:10], y3 = 11:20)
dt1[dt2, on = c( x1 = "x2")]
dt2[dt1, on = c( x2 = "x1")]
dt3[dt1, on = c( y3 = "y1")]
在上述场景中,您必须为每个查询记住近 4 种组合。连同他们的订单。想象一个场景,您有 10 或 20 个直接来自数据库或 csv 的此类表。
dt1[dt2]
dt2[dt1]
dt1[dt3]
dt3[dt1]
一种方法是编写这样的函数。
rememberJoin <- function(table1, table2){
if(
table1 == "dt1" &&
table2 == "dt2"
){
return(c( x1 = "x2"))
} else if(
table1 == "dt2" &&
table2 == "dt1"
){
return(c( x2 = "x1"))
} else if(
table1 == "dt3" &&
table2 == "dt1"
){
return(c( y3 = "y1"))
} else if(
table1 == "dt1" &&
table2 == "dt3"
){
return(c( y1 = "y3"))
}
}
dt1[dt2, on = rememberJoin("dt1", "dt2")]
dt2[dt1, on = rememberJoin("dt2", "dt1")]
dt3[dt1, on = rememberJoin("dt3", "dt1")]
但是整个解决方案很老套,if 语句太多,而且很难阅读或调试。我通过创建命名列表使用了另一种解决方案。
Join <- list(
dt1dt2 = c( x1 = "x2"),
dt2dt1 = c( x2 = "x1"),
dt3dt1 = c( y3 = "y1"),
dt1dt3 = c( y1 = "y3")
)
dt1[dt2, on = Join$dt1dt2]
dt2[dt1, on = Join$dt2dt1]
dt3[dt1, on = Join$dt3dt1]
它工作得很好。但我仍然不确定这是否是最佳解决方案,或者是否有任何包含连接感知表的包。任何建议或替代方案都可以。我有非常复杂的数据集,我正在处理超过 25 个表。我正在寻找解决方案。
【问题讨论】:
-
你能详细说明为什么有4种组合吗? y3 匹配 y1 但 x1 匹配 x2 背后的逻辑是什么?
-
这只是我创建的一个虚拟数据,以表明 dt1 依赖于 dt2 和 dt3...所以你可以有 2 个表以 2 种方式加入,因此 4 种方式
-
dt1[dt2] ; dt2[dt1] ; dt1[dt3] ; dt3[dt1] ;
-
我现在要做的就是探索数据。这是我可以访问的整个数据库快照。我已经将它们导入到多个 csv 中。
-
你可以查看 dwtools 包,它具有批量连接的功能,在 data.table 包中有一个 FR。您可以将您的用例放在那里,这样我们将确保在实施该功能时不会错过它。
标签: r shiny dplyr data.table