我有一个数据表列表,想对每个数据表应用unique()
函数,但这样做会破坏所有的数据表键。
以下是一个例子:
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.table存储在列表中?
- 如何安全地存储/操作数据表,而不必担心丢失我的键?
编辑:
值得一提的是,可怕的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
循环是有害的。
unique.list[[1]] != unique(A)
。我的猜测是,也许在lapply语句中被调用的是{base}
的unique而不是{data.table}
的unique,虽然这只是一个猜测。 - Ricardo Saporta