【发布时间】:2020-04-03 13:32:34
【问题描述】:
将如下矩阵转换为 data.table 的最快方法是什么?
mat <- matrix(1:9, nrow = 3)
1 2 3
4 5 6
7 8 9
我可以使用下面的代码将其转换为 data.table
setDT(data.frame(mat))[]
但这是最快的方法吗?我们可以在不先将其转换为 data.frame 的情况下执行此操作吗?
【问题讨论】:
标签: r data.table
将如下矩阵转换为 data.table 的最快方法是什么?
mat <- matrix(1:9, nrow = 3)
1 2 3
4 5 6
7 8 9
我可以使用下面的代码将其转换为 data.table
setDT(data.frame(mat))[]
但这是最快的方法吗?我们可以在不先将其转换为 data.frame 的情况下执行此操作吗?
【问题讨论】:
标签: r data.table
这里有一些例子来讨论形成data.table的速度,即as.data.table、setDT(as.data.frame(mat))和setDT(data.frame(mat))。
mat <- matrix(1:5e3, nrow = 5)
microbenchmark(unit = "relative",
as.data.table(mat),
setDT(as.data.frame(mat))[],
setDT(data.frame(mat))[])
Unit: relative
expr min lq mean median uq max neval
as.data.table(mat) 1.433084 1.417747 1.340552 1.413278 1.414386 1.070289 100
setDT(as.data.frame(mat))[] 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100
setDT(data.frame(mat))[] 1.287526 1.281964 1.237544 1.284735 1.258662 1.186977 100
mat <- matrix(1:5e3, nrow = 5e2)
microbenchmark(unit = "relative",
as.data.table(mat),
setDT(as.data.frame(mat))[],
setDT(data.frame(mat))[])
Unit: relative
expr min lq mean median uq max neval
as.data.table(mat) 1.114003 1.041410 1.083238 1.070029 1.049262 1.254732 100
setDT(as.data.frame(mat))[] 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100
setDT(data.frame(mat))[] 1.680208 1.467538 1.482018 1.511009 1.479438 1.440440 100
备注:
setDT(as.data.frame(mat))[]是速度的赢家
【讨论】:
as.data.frame,所以你可以看到更新
setDT(as.data.frame(mat))[] 是迄今为止最快的
您可以使用magrittr 管道:
mat <- matrix(1:9, nrow = 3) %>% data.table()
没有magrittr:
mat <- data.table(matrix(1:9, nrow = 3))
【讨论】:
data.table() 而不是as.data.frame(),但您需要magrittr 才能使用%>%。