【发布时间】: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