【问题标题】:Equivalent of select i.*相当于选择 i.*
【发布时间】:2019-07-04 09:08:04
【问题描述】:

我正在整理我从 SQL 转换的一些 data.table 代码。

桌子 x

x <- data.table(a = 1
                ,b = 2); x
#    a b
# 1: 1 2

表 y

y <- data.table(a = 1
                ,c = 3); y
#    a c
# 1: 1 3

默认情况下,以下连接返回所有列

x[y, on=.(a)]
#    a b c
# 1: 1 2 3

其中列 a 采用表 i 的值,但名称来自 x 给定格式 x[i]

我的问题是是否可以只选择表 i 中的所有列。这将是 SQL 中的select i.* from...。这对我来说是无价的,因为实际上我的表 i 和 x 都包含大量列,我想直接嵌套到 data.table 的连接子句中,而不列出 .() 中的所有表 i 的列或进行列选择在单独的行中。

谢谢。

【问题讨论】:

  • 你在寻找x[y, on=.(a), mget(paste0("i.", names(y)))]
  • 是的。我看到我们必须使用基础 R 并嵌套。没有 data.table 语法吗?刚刚发现如何手动从 x 中选择列 x[y, on=.(a), mget(c(paste0("i.", names(y)), "x.a"))] 谢谢@chinsoon12
  • 请参阅“2g) 为什么让 j 如此灵活?”在cran.r-project.org/web/packages/data.table/vignettes/…
  • 抱歉,@chinsoon12 我想将我的第一条评论编辑为“我明白了。我们将不得不......”。但只允许在第 1 5 分钟内进行编辑。标点符号重要性的经典案例。感谢您的帮助。也经历过2g :)

标签: r join data.table


【解决方案1】:

不确定该解决方案的应用程序和计算效率,但这样做很简洁:

x[y, on = .(a)][, .SD, .SDcols = names(y)]

【讨论】:

  • 谢谢@sindri_baldur 这也可以。但是,我如何能够从 x 中获取选定的列,例如x.b
  • 不确定我是否理解。没有一个具体的例子很难...您可以更改为.SDcols = names(x) 或简单地:x[y, on = .(a)]...但我猜您不是在寻找这些吗?
  • 使用您的解决方案可以检索表y 中的所有列。这确实回答了我原来的问题。谢谢你。但是,如果在原始问题之上,我还想从表 x 中获取某个列,例如x.b 从有问题的虚拟数据中,b 列位于表 x 中。
  • @T.Fung 对于这个特定的例子,你可以这样做:x[y, on = .(a)][, .SD, .SDcols = c(names(y), "b")]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多