什么时候应该使用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)将后面的对象改变mydatadata.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不是listdata.frame 。 最常见的用途是矩阵。

    链接地址: http://www.djcxy.com/p/68797.html

    上一篇: When should I use setDT() instead of data.table() to create a data.table?

    下一篇: Normalize each row of data.table