Как использовать неизвестное количество ключевых столбцов в data.table
Я хочу сделать то же, что объяснилВотдобавление отсутствующих строк в таблицу данных. Единственная дополнительная трудность, с которой я сталкиваюсь, состоит в том, что я хочу, чтобы количество ключевых столбцов, то есть тех строк, которые используются для самосоединения, было гибким.
Вот небольшой пример, который в основном повторяет то, что сделано в ссылке, упомянутой выше:
df <- data.frame(fundID = rep(letters[1:4], each=6),
cfType = rep(c("D", "D", "T", "T", "R", "R"), times=4),
variable = rep(c(1,3), times=12),
value = 1:24)
DT <- as.data.table(df)
idCols <- c("fundID", "cfType")
setkeyv(DT, c(idCols, "variable"))
DT[CJ(unique(df$fundID), unique(df$cfType), seq(from=min(variable), to=max(variable))), nomatch=NA]
Что беспокоит меня, так это последняя строчка. я хочуidCols
быть гибким (например, если я использую его внутри функции), поэтому я не хочу набиратьunique(df$fundID), unique(df$cfType)
вручную. Однако я просто не могу найти обходного пути для этого. Все мои попытки автоматически разделить подмножествоdf
в векторы, по мере необходимостиCJ
, ошибка с сообщением об ошибкеError in setkeyv(x, cols, verbose = verbose) : Column 'V1' is type 'list' which is not (currently) allowed as a key column type.
CJ(sapply(df[, idCols], unique))
CJ(unique(df[, idCols]))
CJ(as.vector(unique(df[, idCols])))
CJ(unique(DT[, idCols, with=FALSE]))
Я также попытался построить выражение сам:
str <- ""
for (i in idCols) {
str <- paste0(str, "unique(df$", i, "), ")
}
str <- paste0(str, "seq(from=min(variable), to=max(variable))")
str
[1] "unique(df$fundID), unique(df$cfType), seq(from=min(variable), to=max(variable))"
Но тогда я не знаю, как использоватьstr
, Это все терпит неудачу:
CJ(eval(str))
CJ(substitute(str))
CJ(call(str))
Кто-нибудь знает хороший обходной путь?