我有一个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
请注意,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
的{{1}}键,因此id
s之间没有任何关系导致结果破裂。id
:不起作用,因为它被解释为没有过滤器dt$id
的整个向量dt[, id]
。因此,我收到一些关于不匹配的项目数量和破坏结果的警告。id <= 3
或dt[.I]$id
:有效,但看起来没有&#34;正确&#34;,因为它不是dt$id[.I]
中使用的id
&#39; dt
论证本身,但类似的副本。j
和get
但没有成功。我知道我可以通过连接操作达到我预期的结果:
eval
甚至可以在lookup[dt[id <= 3], on="id"]
和j
列的dt
参数中进行进一步的计算。
但我仍然希望上面的表达式正确替换lookup
,因为我认为它对我的目的更具表现力。我想我需要知道插入那里的合适环境。
这可能吗?如何?
答案 0 :(得分:1)
您应该像这样再次设置过滤器,以实现您的目标。
dt[id <= 3, .(id, x1, x2=lookup[.(dt[id<=3]$id), x2])]