【发布时间】:2013-02-02 09:50:26
【问题描述】:
我在一个列表中有一堆 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 循环是邪恶的。
【问题讨论】:
-
有趣的是,
unique.list[[1]] != unique(A)。我的猜测虽然只是一个猜测,但也许 lapply 语句中调用的是{base}唯一而不是{data.table}unique。 -
我认为你是对的。我刚刚注意到 - 随着密钥被销毁 -
unique在通过lapply时甚至没有完成它的工作 -
@PaulMurray +1 好问题,但 destroy 似乎有点强。在这种情况下,它不会保留它们。
-
@MatthewDowle“为语言编辑”
-
或者你应该像“data.table and lapply annihilate table keys”一样一路走下去
标签: r data.table lapply