【问题标题】:Fastest way to convert a matrix to a data.table将矩阵转换为 data.table 的最快方法
【发布时间】: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


    【解决方案1】:

    这里有一些例子来讨论形成data.table的速度,即as.data.tablesetDT(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 而不是 data.frame?
    • @jangorecki 谢谢!我只是使用OP的方法进行比较。我在基准测试中添加了as.data.frame,所以你可以看到更新
    • @johnc 请查看我的更新答案,看来setDT(as.data.frame(mat))[] 是迄今为止最快的
    • 注意data.table有一个专门的C函数,应该会大大减少as.matrix.data.table方法的时间。状态见github.com/Rdatatable/data.table/pull/4144
    【解决方案2】:

    您可以使用magrittr 管道:

    mat <- matrix(1:9, nrow = 3) %>% data.table()
    

    没有magrittr

    mat <- data.table(matrix(1:9, nrow = 3)) 
    

    【讨论】:

    • 谢谢,马特!你会不会碰巧知道如何在不使用 data.table 以外的包的情况下转换它?
    • 我更新了答案以包含data.table() 而不是as.data.frame(),但您需要magrittr 才能使用%&gt;%
    • 哈哈,谢谢!我以为我必须使用 setDT() 并没有想到 data.table()。谢谢你,马特!
    • 没问题!如果它解决了您的问题,请随时单击绿色复选标记以接受答案
    • 抱歉,由于速度比较,我不得不接受另一个答案。希望我能同时接受。但我非常感谢您抽出时间来回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-19
    • 2020-09-02
    • 1970-01-01
    • 2019-01-15
    • 2013-06-08
    • 2016-08-24
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多