什么时候应该使用setDT()而不是data.table()来创建data.table?
我很难setDT()
函数的本质。 当我在SO上读取代码时,我经常遇到使用setDT()
创建data.table。 当然data.table()的使用是无处不在的。 我觉得我很data.table()
的本质,但data.table()
的相关性setDT()
我无法setDT()
。 ?setDT
告诉我这个:
setDT通过引用将列表(包括named和unnamed)和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()
能够做的事呢?
setDT()
是不进行更换data.table()
它可以更有效地替代as.data.table()
,它可以用于某些类型的对象。
mydata <- as.data.table(mydata)
会将对象复制到mydata
后面,将副本转换为data.table
,然后将mydata
符号更改为指向副本。 setDT(mydata)
将后面的对象改变mydata
到data.table
。 没有复制完成。 那么使用setDT()
什么现实的情况? 当你无法控制原始数据的类时。 例如,大多数用于处理数据库的包都提供data.frame
输出。 在这种情况下,你的代码会是这样的
mydata <- dbGetQuery(conn, "SELECT * FROM mytable") # Returns a data.frame
setDT(mydata) # Make it a data.table
什么时候应该使用as.data.table(x)
? 每当x
不是list
或data.frame
。 最常见的用途是矩阵。
上一篇: When should I use setDT() instead of data.table() to create a data.table?