Verwendung einer unbekannten Anzahl von Schlüsselspalten in einer data.table

Ich möchte das Gleiche tun wie erklärtHierHinzufügen fehlender Zeilen zu einer Datentabelle. Die einzige zusätzliche Schwierigkeit, mit der ich konfrontiert bin, besteht darin, dass die Anzahl der Schlüsselspalten, d. H. Der Zeilen, die für die Selbstverknüpfung verwendet werden, flexibel sein soll.

Hier ist ein kleines Beispiel, das im Grunde das wiederholt, was in dem oben erwähnten Link gemacht wird:

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]

Was mich stört, ist die letzte Zeile. Ich willidCols flexibel zu sein (zum Beispiel, wenn ich es innerhalb einer Funktion benutze), damit ich nicht tippen möchteunique(df$fundID), unique(df$cfType) manuell. Ich finde jedoch keine Lösung dafür. Alle meine Versuche, die Teilmenge von automatisch zu teilendf in Vektoren, je nach Bedarf vonCJscheitern mit der FehlermeldungFehler in setkeyv (x, cols, verbose = verbose): Spalte 'V1' ist der Typ 'list', der (derzeit) nicht als Schlüsselspaltentyp zulässig ist.

CJ(sapply(df[, idCols], unique))
CJ(unique(df[, idCols]))
CJ(as.vector(unique(df[, idCols])))
CJ(unique(DT[, idCols, with=FALSE]))

Ich habe auch versucht, den Ausdruck selbst zu erstellen:

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))"

Aber dann weiß ich nicht, wie man es benutztstr. Das alles schlägt fehl:

CJ(eval(str))
CJ(substitute(str))
CJ(call(str))

Kennt jemand eine gute Problemumgehung?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage