我有一个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
。注意,的x1
和x2
所述至少显著位是相同的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
的id
键,从而存在id
领先于一个破碎的结果之间没有任何关系不工作。dt$id
:不起作用,因为它被解释为整个矢量dt[, id]
没有过滤器id <= 3
。因此,我收到一些有关不匹配项目数量和结果中断的警告。dt[.I]$id
或dt$id[.I]
:工作,但看起来不“正确”的,因为它不是在dt
的j
争论本身,而是一个类似副本使用的id
。- 我也尝试过
get
和eval
没有成功。
我知道我可以通过连接操作实现自己预期的结果:
lookup[dt[id <= 3], on="id"]
即使做进一步的计算中j
参数上dt
的和lookup
的列。
但我仍然会更喜欢上面的表达方式,并正确替换??id??
,因为我认为它对我的目的更具表现力。我想我需要知道在那里插入正确的环境。
这是可能的和如何?
我不明白为什么'lookup [dt [id <= 3],on =“id”]'是不可接受的。 – thelatemail
'lookup [dt [id <= 3],on =“id”]'对我来说看起来更加干净和健壮。任何解决方案,包括手动采取所有的列对我来说似乎是个坏主意。 –
我认为'dt [id <= 3,。(id,x1,x2 = lookup [。(?? id ??),x2])]''更具表现力,因为我可以立即看到''x2' ''lookup''的值被应用于使用''dt''元素进行计算。''lookup [dt [id <= 3],on =“id”]''这对我来说不是那么明显,部分原因是''dt''在''lookup'里面。也许这也是因为我是R新人,但是有经验的程序员。 – bjhend