我想做与此处解释的相同的操作,即将缺失的行添加到 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
自动将作为键列类型。
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))
有谁知道一个好的解决方法?