我在列表中有一堆 data.tables。我想应用unique()
到列表中的每个 data.table,但这样做会破坏我所有的 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 添加到 list 并使用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
循环是邪恶的。