Мне трудно понять суть функции setDT()
. Когда я читаю код на SO, я часто сталкиваюсь с использованием setDT()
для создания data.table. Конечно, использование data.table() вездесущ. Я чувствую, что я твердо понимаю природу data.table()
, но релевантность setDT()
ускользает от меня. ?setDT
говорит мне следующее:
setDT преобразует списки (как именные, так и неназванные) и data.frames в data.tables по ссылке.
а также:
В языке data.table все заданные * функции меняют свой вход по ссылке. То есть никакой копии не делается вообще, кроме временной рабочей памяти, которая равна одному столбцу.
Итак, это заставляет меня думать, что я должен использовать setDT()
для создания data.table, правильно? Является ли setDT()
просто списком для преобразователя data.table?
library(data.table)
a <- letters[c(19,20,1,3,11,15,22,5,18,6,12,15,23)]
b <- seq(1,41,pi)
ab <- data.frame(a,b)
d <- data.table(ab)
e <- setDT(ab)
str(d)
#Classes ‘data.table’ and 'data.frame': 13 obs. of 2 variables:
# $ a: Factor w/ 12 levels "a","c","e","f",..: 9 10 1 2 5 7 11 3 8 4 ...
# $ b: num 1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>
str(e)
#Classes ‘data.table’ and 'data.frame': 13 obs. of 2 variables:
# $ a: Factor w/ 12 levels "a","c","e","f",..: 9 10 1 2 5 7 11 3 8 4 ...
# $ b: num 1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>
По-видимому, никакой разницы в этом случае нет. В другом случае разница очевидна:
ba <- list(a,b)
f <- data.table(ba)
g <- setDT(ba)
str(f)
#Classes ‘data.table’ and 'data.frame': 2 obs. of 1 variable:
# $ ba:List of 2
# ..$ : chr "s" "t" "a" "c" ...
# ..$ : num 1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>
str(g)
#Classes ‘data.table’ and 'data.frame': 13 obs. of 2 variables:
# $ V1: chr "s" "t" "a" "c" ...
# $ V2: num 1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>
Когда следует использовать setDT()
? Что делает setDT()
релевантным? Почему бы просто не сделать оригинальную функцию data.table()
способной выполнять то, что может сделать setDT()
?