2017-07-17 161 views
0

我有一个data.table包含一些要查找的值,另一个data.table应该使用查找表的一些值进行计算。不幸的是,这两个data.table都有我需要使用的相同列名。在另一个data.table中使用lookup 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:因为它解释为lookupid键,从而存在id领先于一个破碎的结果之间没有任何关系不工作。
  • dt$id:不起作用,因为它被解释为整个矢量dt[, id]没有过滤器id <= 3。因此,我收到一些有关不匹配项目数量和结果中断的警告。
  • dt[.I]$iddt$id[.I]:工作,但看起来不“正确”的,因为它不是在dtj争论本身,而是一个类似副本使用的id
  • 我也尝试过geteval没有成功。

我知道我可以通过连接操作实现自己预期的结果:

lookup[dt[id <= 3], on="id"] 

即使做进一步的计算中j参数上dt的和lookup的列。

但我仍然会更喜欢上面的表达方式,并正确替换??id??,因为我认为它对我的目的更具表现力。我想我需要知道在那里插入正确的环境。

这是可能的和如何?

+4

我不明白为什么'lookup [dt [id <= 3],on =“id”]'是不可接受的。 – thelatemail

+1

'lookup [dt [id <= 3],on =“id”]'对我来说看起来更加干净和健壮。任何解决方案,包括手动采取所有的列对我来说似乎是个坏主意。 –

+0

我认为'dt [id <= 3,。(id,x1,x2 = lookup [。(?? id ??),x2])]''更具表现力,因为我可以立即看到''x2' ''lookup''的值被应用于使用''dt''元素进行计算。''lookup [dt [id <= 3],on =“id”]''这对我来说不是那么明显,部分原因是''dt''在''lookup'里面。也许这也是因为我是R新人,但是有经验的程序员。 – bjhend

回答

1

你应该像这样再次设置过滤器来实现你想要的。

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

感谢您的建议+1。不幸的是,它不是我正在查找的内容,因为它重复了“id <= 3”的条件,当意外更改其中一个时,可能会导致潜在错误。我更多地寻找一个环境引用来访问dt的''id''而不是''lookup''。 – bjhend