У меня есть куча data.tables в списке. Я хочу применить 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
Вероятно, это связано с тем, что я не совсем понимаю, что означает назначение ключей «по ссылке», поскольку у меня были другие проблемы с исчезновением ключей.
So:
- Почему 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
. - person Ricardo Saporta   schedule 18.02.2013unique
даже не выполняет свою работу при передаче черезlapply
- person Paul Murray   schedule 18.02.2013