在 R 中,我有一个具有以下结构的 data.table:
DT <- data.table(M=c(1,2,3,4,5), N=c(2,3,1,1,4), mu=c(1,10,100,1000,10000), sigma=c(10,10,10,10,10))
这里 M 是模拟数,N 是观测值数,mu 和 sigma 是正态分布的参数。根据观察的数量,我想生成具有相应参数 mu 和 sigma 的正态分布的随机数。例如,看一下第二行:生成 3 个随机正态分布数,其中 mu=10 且 sigma=10
rnorm(3,10,10)
这些随机正态分布数应写在DT中。为此,我向 DT 添加了有关 N 最大值的尽可能多的列
DT[, paste0("X.", seq(1, max(DT[, N]))):=NA]
因此,对于模拟 M=3,我只想用 mu=10 和 sigma=10 的三个随机正态分布数更新 X.1、X.2 和 X.3 列。但是我怎样才能通过查看一个非常大的 data.table 来做到这一点呢?
我尝试通过使用 set-function 对列进行 for 循环来解决这个问题
for (j in 5:ncol(DT)) {
X.random <- rnorm(n=DT[, N], mean=DT[, mu], sd=DT[, sigma])
set(DT, j=j, value=X.random)
}
但通过这种方式,不考虑“条件”N(观察数),因为所有列 X.1:X.4 都已更新。此外,有时我不确定参数是否按行获取。我怎样才能做到这一点?
编辑: 没有阅读您的答案,我就更新了 for 循环:
for (j in 5:ncol(DT)) {
idx <- which(DT[, N]-(j-4) >= 0)
X.random <- rnorm(n=DT[idx, N], mean=DT[idx, mu], sd=DT[idx, sigma])
set(DT, i=idx, j=j, value=X.random)
}
遗憾的是,set
函数不会将随机正态分布数字写入相应的列 X.1:X.4,而仅写入 bool 值。
最佳答案
您可以使用dcast
:
dcast(
DT[, .(id=1:N, val=rnorm(N, mu, sigma)), by=.(M, N, mu, sigma)],
M + mu + sigma ~ id, value.var="val"
)
产品:
M mu sigma 1 2 3 4
1: 1 1 10 -5.779204 -3.060535 NA NA
2: 2 10 10 13.070796 15.765328 12.30571 NA
3: 3 100 10 99.720755 NA NA NA
4: 4 1000 10 998.277712 NA NA NA
5: 5 10000 10 9999.507019 9997.459322 10010.48480 10003.36
尽管实际上您应该将数据保留为长格式(即上面的 dcast 的第一个参数,因为该格式的数据通常更容易分析)。
关于R:更新 data.table 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787885/