ここで説明したのと同じことをしたい、つまり、欠落している行を 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で失敗しますキー列タイプとして。
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))
誰か良い回避策を知っていますか?