在另一个data.table

时间:2017-07-17 23:46:47

标签: r data.table

我有一个data.table包含要查找的值和另一个data.table,它应该使用查找表的某些值进行计算。不幸的是,data.table都有我需要使用的相同列名。

简化示例:

dt <- data.table(id=1:5, x1=101:105, key="id")
dt

   id  x1
1:  1 101
2:  2 102
3:  3 103
4:  4 104
5:  5 105

lookup <- data.table(id=c(2,3,5), x2=c(102,103,105), key="id")
lookup

   id  x2
1:  2 102
2:  3 103
3:  5 105

请注意,x1x2的最低有效数字与id相同,以便在示例中轻松将其关联起来。

现在,我想做类似

的事情
dt[id <= 3, .(id, x1, x2=lookup[.(??id??), x2])]

实现

   id  x1  x2
1:  1 101  NA
2:  2 102 102
3:  3 103 103

但我无法弄清楚要插入??id??的内容。到目前为止,我已经尝试过:

  • id:不起作用,因为它被解释为lookup的{​​{1}}键,因此id s之间没有任何关系导致结果破裂。
  • id:不起作用,因为它被解释为没有过滤器dt$id的整个向量dt[, id]。因此,我收到一些关于不匹配的项目数量和破坏结果的警告。
  • id <= 3dt[.I]$id:有效,但看起来没有&#34;正确&#34;,因为它不是dt$id[.I]中使用的id &#39; dt论证本身,但类似的副本。
  • 我还尝试了jget但没有成功。

我知道我可以通过连接操作达到我预期的结果:

eval

甚至可以在lookup[dt[id <= 3], on="id"] j列的dt参数中进行进一步的计算。

但我仍然希望上面的表达式正确替换lookup,因为我认为它对我的目的更具表现力。我想我需要知道插入那里的合适环境。

这可能吗?如何?

1 个答案:

答案 0 :(得分:1)

您应该像这样再次设置过滤器,以实现您的目标。

dt[id <= 3, .(id, x1, x2=lookup[.(dt[id<=3]$id), x2])]