【问题标题】:Storing simulation results as data.table in R将模拟结果存储为 R 中的 data.table
【发布时间】:2015-07-31 17:07:37
【问题描述】:

我必须做大量的模拟,这需要很多时间。我认为可以通过data.table 减少处理时间。如何将mdply(data.frame(prob=seq(from = 0.1, to = 0.9, by = 0.1)), rbinom, n = 5, size = 2) 的结果存储到data.table 而不先将其输出保存到data.frame

library(plyr)
df1 <- mdply(data.frame(prob=seq(from = 0.1, to = 0.9, by = 0.1)), rbinom, n = 5, size = 2)
library(data.table)
dt1 <- data.table(df1)

已编辑

我知道我可以使用setDT(df1) 来避免创建dt1。然而,主要问题是关于mdply,它创建了一个data.frame,这会消耗大量时间。

【问题讨论】:

  • 如果您使用 setDT(df1) 它会将 df1 “通过引用”转换为 data.table 并且您不需要分配结果/创建另一个对象(您可以查看有关它)。我不读 plyrish,所以我无法评论改变它。
  • 是的,我知道我可以使用setDT(df1) 来避免创建dt1。然而,主要问题是关于mdply,它创建了一个data.frame
  • 在运行rbinom 之前为什么不把它变成data.table
  • 好的,现在我明白了。一个普遍的观点:使用矩阵进行模拟要快得多。因此,如果您关心处理时间,请学习使用矩阵而不是包。

标签: r data.table plyr


【解决方案1】:

plyrdata.table 的用途非常相似,因此您通常根本不需要在两者之间来回切换。在这种情况下,您可以使用 data.table 完成所有操作:

dt = data.table(prob = seq(0.1, 0.9, by = 0.1))
dt = dt[, as.list(rbinom(prob, n = 5, size = 2)), by = prob]
dt
   prob V1 V2 V3 V4 V5
1:  0.1  0  0  0  0  0
2:  0.2  0  0  0  0  1
3:  0.3  1  2  1  0  1
4:  0.4  1  1  2  1  0
5:  0.5  2  2  1  1  1
6:  0.6  1  1  0  0  1
7:  0.7  2  1  2  1  0
8:  0.8  2  1  2  0  1
9:  0.9  2  2  2  2  2

我要补充一点,我的直觉是,最快的方法是先制作矩阵,然后分配列。

> mat = mapply(rbinom, prob = dt$prob, n = 5, size = 2)
> cbind(dt, t(mat))
   prob V1 V2 V3 V4 V5
1:  0.1  0  0  0  0  0
2:  0.2  1  0  0  1  1
3:  0.3  1  1  1  0  0
4:  0.4  1  0  2  1  1
5:  0.5  1  1  1  0  2
6:  0.6  2  0  2  1  1
7:  0.7  1  1  1  2  1
8:  0.8  1  2  1  0  2
9:  0.9  1  1  2  1  1

对 8000 行表的快速测试表明这更快:

> dt = data.table(prob = (seq(0.1, 0.9, by = 0.00001)))
> system.time(for(i in 1:10) dt[, as.list(rbinom(prob, n = 5, size = 2)), by = prob])
   user  system elapsed 
   6.14    0.00    6.16 
> system.time(for(i in 1:10) {mat = mapply(rbinom, prob = dt$prob, n = 5, size = 2) ; cbind(dt, t(mat))})
   user  system elapsed 
   2.61    0.00    2.62 

两者都是对原版的实质性改进:

> system.time(for(i in 1:10) {df1 = mdply(df, rbinom, n = 5, size = 2) ; dt1 = data.table(df1)})
   user  system elapsed 
 152.23   46.60  200.07

【讨论】:

  • 以长格式存储也很快.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多