【问题标题】:Filling a data table using vectorized functions in R使用 R 中的矢量化函数填充数据表
【发布时间】:2025-12-17 02:40:01
【问题描述】:

我正在尝试使用矢量化操作在 R 中填写数据表:

library(data.table)
x = 5
y = 3
Foo = data.table(Bar = 1:x)
Foo[,paste0("simulation",1:y) := Bar * rnorm(y,,Bar)]

我认为对于每一行,rnorm(y,,Bar) 会生成一个 y 长度向量(使用该行的 Bar 作为标准偏差),将其乘以该行的 Bar 值,然后填写相应的列.然而,似乎(来自其他实验)试图先向下列。有没有办法改变这种行为?

【问题讨论】:

  • 不要将向量放在表格行上,因为 R 将向量存储在列上。而是将其存储为长格式:Foo[, .(Bar = rep(Bar, each = y), v = rnorm(y*.N, , rep(Bar, each=.N)))]Foo[, rnorm(y,,Bar), by=Bar]
  • 所以您建议只使用两列,并为 Bar 的每个值创建 y 行?有没有一种简单的方法可以将其折叠回我想要的格式(y+1 列,Bar 的每个值只有一行)?
  • 是的,您可以使用res <- Foo[, rnorm(y,,Bar), by=Bar]; dcast(res, Bar ~ rowid(Bar, prefix="sim"))。但是,与更惯用的res[, do_stuff, by=Bar] 相比,我认为这很难进行分析。根据我的经验,将其设为宽格式对于浏览而不是分析最有用。
  • 问题是,在我的实际代码中,我无法保证条形图是唯一的(实际上它们可能不会;我正在尝试对时间序列数据进行蒙特卡罗模拟) .在那种情况下,整个系统都会崩溃,不是吗?我想我可以添加一个索引列和分组?
  • 非常感谢您的帮助!

标签: r data.table vectorization


【解决方案1】:

我们可以遍历 'Bar' 的值并创建 rnorm

Foo[, paste0("simulation",seq_len(y)) :=transpose(lapply(Bar, function(z) rnorm(y, sd = z)))]

【讨论】:

  • 这不是牺牲了矢量化的优势吗?