【发布时间】:2017-06-14 13:07:12
【问题描述】:
我很难掌握setDT() 函数的本质。在阅读 SO 上的代码时,我经常遇到使用 setDT() 创建 data.table 的情况。当然data.table() 的使用无处不在。我觉得我完全理解data.table() 的本质,但setDT() 的相关性却让我无法理解。 ?setDT 告诉我这个:
setDT将列表(命名和未命名)和 data.frames通过引用转换为 data.tables。
还有:
在
data.table的说法中,所有set*函数都通过引用更改其输入。也就是说,除了一列大小的临时工作内存之外,根本不进行任何复制。
所以这让我觉得我应该只使用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() 能够做的事情?
【问题讨论】:
-
如果数据已经存在于 data.frame 中,并且您很乐意将该 data.frame(或列表)转换为 data.table,然后使用 setDT()。如果你想从向量或其他东西构造一个 data.table,请使用 data.table()。您永远不应该这样做
x <- setDT(y)- 我认为您误解了通过引用修改对象的含义。可能想要浏览一下这些小插曲:r-datatable.com/Getting-Started -
并且,看看在将新列分配给
d和e后abdata.table 会发生什么:d[, newCol := 1]; ab; e[, newCol := 1]; ab。 -
@Frank 我会跳回到文献中。您可能知道,对于某些人来说,需要多次迭代才能点击——比如我自己。感谢您为我指明正确的方向。
-
@SymbolixAU 哇!这太疯狂了……他们已经建立了联系。
ab通过使用setDT()对e的更改进行更新。诡异的!现在我可以在接下来的几天里尝试解决这个问题。 -
这就是为什么与获取对象的副本(即
data.table())相比,了解“按引用更新”(即setDT())的作用很重要。
标签: r data.table