リストにたくさんの data.tables があります。リスト内の各 data.tableに適用したいのですunique()
が、そうするとすべての data.table キーが破棄されます。
次に例を示します。
A <- data.table(a = rep(c("a","b"), each = 3), b = runif(6), key = "a")
B <- data.table(x = runif(6), b = runif(6), key = "x")
blah <- unique(A)
ここにはblah
まだ鍵があり、すべてが正しいです。
key(blah)
# [1] "a"
しかし、data.tables をリストに追加して使用するlapply()
と、キーが破棄されます。
dt.list <- list(A, B)
unique.list <- lapply(dt.list, unique) # Keys destroyed here
lapply(unique.list, key)
# [[1]]
# NULL
# [[2]]
# NULL
これはおそらく、キーが「参照によって」割り当てられることの意味をよく理解していないことに関係しています。キーが消えるという他の問題があったからです。
そう:
- lapply が鍵を保持しないのはなぜですか?
- キーが「参照によって」割り当てられるとはどういう意味ですか?
- リストにdata.tablesを保存する必要がありますか?
- キーを失うことを恐れずに data.tables を安全に保存/操作するにはどうすればよいですか?
編集:
価値があるのは、恐ろしいfor
ループも問題なく機能することです。
unique.list <- list()
for (i in 1:length(dt.list)) {
unique.list[[i]] <- unique(dt.list[[i]])
}
lapply(unique.list, key)
# [[1]]
# [1] "a"
# [[2]]
# [1] "x"
しかし、これは R であり、for
ループは悪です。