使用存储在变量中的列名来连接数据表

Jek*_*ina 14 join r data.table

我有2个data.tables:

library(data.table)
dt1 <- data.table(id = 1:5, value1 = 11:15, value2 = 21:25, value3 = 36:40)
dt2 <- data.table(name = c("value1", "value1", "value1", "value1", 
                            "value2", "value2", "value2", "value3", "value3"), 
              valueMin = c(10, 13, 14, 18, 21, 24, 25, 36, 38), 
              valueMax = c(13, 14, 18, 20, 24, 25, 27, 38, 42), 
              label = c(101:104, 201:203, 301:302))
> dt1
   id value1 value2 value3
1:  1     11     21     36
2:  2     12     22     37
3:  3     13     23     38
4:  4     14     24     39
5:  5     15     25     40
> dt2
     name valueMin valueMax label
1: value1       10       13   101
2: value1       13       14   102
3: value1       14       18   103
4: value1       18       20   104
5: value2       21       24   201
6: value2       24       25   202
7: value2       25       27   203
8: value3       36       38   301
9: value3       38       42   302
Run Code Online (Sandbox Code Playgroud)

我希望得到的结果是这样的:从加入标签dt2,以dt1通过这样的事实value1dt1是valueMin和valueMax之间dt2dt2$name匹配value1).这是我的解决方案(给出正确的结果):

varName <- "value1"
dt2_temp <- dt2[name == varName,]
dt1[dt2_temp, on = .(value1 > valueMin, value1 <= valueMax), nomatch = 0] %>%
select(id, label)
   id label
   1:  1   101
   2:  2   101
   3:  3   101
   4:  4   102
   5:  5   103
Run Code Online (Sandbox Code Playgroud)

我想对(使用循环)中的label所有其余列(value2,value3)执行相同的(获取列)dt1,因此需要将连接中的列名替换为其value1存储的名称varName,例如:

dt1[dt2_temp, on = .(varName > valueMin, varName <= valueMax), nomatch = 0]
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有成功使用:简单varName,eval(varName),as.name(varName).你知道如何解决这个问题吗?

错误消息类似于:

Error in `[.data.table`(dt1, dt2_temp, on = .(varName > valueMin, varName <= valueMax),  : 
  Column(s) [varName,varName] not found in x
Run Code Online (Sandbox Code Playgroud)

Jaa*_*aap 10

为什么不在没有循环的情况下一次性完成所有操作?

可能的解决方案:

melt(dt1, id = 1)[dt2, on = .(variable = name, value > valueMin, value <= valueMax), lbl := i.label
                  ][, dcast(.SD, id ~ variable, value.var = c("value","lbl"))]
Run Code Online (Sandbox Code Playgroud)

这使:

   id value_value1 value_value2 value_value3 lbl_value1 lbl_value2 lbl_value3
1:  1           11           21           36        101         NA         NA
2:  2           12           22           37        101        201        301
3:  3           13           23           38        101        201        301
4:  4           14           24           39        102        201        302
5:  5           15           25           40        103        202        302
Run Code Online (Sandbox Code Playgroud)