R:更新 data.table 中的列

R: Update columns in a data.table

在 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 的正态分布中生成随机数。例如看看第二行:generating 3 random normal distributed numbers with mu=10 and sigma=10 by

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)
}

但在这种情况下,"condition" 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,只有布尔值。

诚然,我是数据 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))


for (i in 1:nrow(DT)){
    X.random <- rnorm(n=DT[i, N], mean=DT[i, mu], sd=DT[i, sigma])
    j=paste0("X.", seq(1, DT[i, N]))
    set(DT, i=i,j=j, value=X.random)

}

DT

   M N    mu sigma         X.1         X.2        X.3      X.4
1: 1 2     1    10   -2.286063   -2.286063         NA       NA
2: 2 3    10    10   13.843578   13.843578   13.84358       NA
3: 3 1   100    10   97.616599          NA         NA       NA
4: 4 1  1000    10 1014.386157          NA         NA       NA
5: 5 4 10000    10 9992.771152 9992.771152 9992.77115 9992.771

您可以使用 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 的第一个参数,因为该格式的数据通常更易于分析)。