Мне нужно объединить информацию столбца h
фрейма данных Y
в фрейм данных X
. В приведенном ниже коде показан желаемый результат.
library(data.table)
X <- data.table(
a1 = rep("A", 6),
b1 = rep(1,6),
c1 = rep(c(0,1), 1, each = 3),
d = letters[1:6]
)
Y <- data.table(
a2 = rep(c("A","B", "C"), 1, each = 2),
b2 = rep(c(1, 2, 3), 1, each = 2),
c2 = rep(c(0,1), 3),
h = letters[7:12]
)
# final result
X[Y,
on = .(a1 = a2,
b1 = b2,
c1 = c2),
h := i.h
][]
#> a1 b1 c1 d h
#> 1: A 1 0 a g
#> 2: A 1 0 b g
#> 3: A 1 0 c g
#> 4: A 1 1 d h
#> 5: A 1 1 e h
#> 6: A 1 1 f h
Создано 2020-08-03 пакетом REPEX (v0.3.0)
Проблема, однако, в том, что имена столбцов, которые я использую для объединения, различаются в зависимости от информации, хранящейся где-то еще. Итак, предположим, что имя столбца c1
в X
хранится в var
, скажем var <- "c2"
. Теперь, когда я попытался выполнить соединение, похоже, ничего не работает.
# None the attempts below works
var <- "c1"
# attempt 1
X[Y,
on = .(a1 = a2,
b1 = b2,
eval(var) = c2),
h := i.h
][]
# attempt 2
X[Y,
on = .(a1 = a2,
b1 = b2,
get(var) = c2),
h := i.h
][]
# attempt 3
cond <- paste0(deparse(var), " = c2")
parcond <- parse(text = cond)
X[Y,
on = .(a1 = a2,
b1 = b2,
eval(parcond)),
h := i.h
][]
В конце концов, единственный способ, который я нашел для его решения, очень неэлегантен, но, похоже, он работает.
var <- "c1"
setnames(X, var, "c2")
X[Y,
on = c("a1" = "a2",
"b1" = "b2",
"c2"),
h := i.h
][]
setnames(X, "c2", var)
Однако мне интересно, есть ли лучший способ сделать это программно.
Я проверил все эти ссылки , но не смог найти решение, которое подойдет мне .
Большое спасибо за вашу помощь.