У меня есть 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
Результат, который я ожидаю, следующий: объединение метки с dt2
в dt1
dt2
с тем, что value1
в dt1
находится между значениемMin и значениемMax в dt2
и dt2$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
Я хотел бы сделать то же самое (получить столбцы label
) для всех остальных столбцов (value2
, value3
) в dt1
(используя цикл), поэтому нужно заменить ссылку на имя столбца value1
в join на имя, хранящееся в varName
, что-то вроде:
dt1[dt2_temp, on = .(varName > valueMin, varName <= valueMax), nomatch = 0]
К сожалению, мне не удалось использовать: просто 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