R:更新 data.table 中的列

标签 r data.table multiple-columns

在 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/

相关文章:

r - 如何在R中导入数据并创建散点图?

r - 如何在 R Shiny 中截断 DataTable 中的文本?

data.table 中的滚动联接未提供所需的输出

r - 性能考虑 data.table 中的 get()

r - 如何使用shinyjs一次隐藏/显示多个元素?

r - 在事件之前计算行数 - data.table

python - 输出不按行显示

CSS 多列 : not all columns filled

jquery - 打破多列div

r - 如何使用 ggplot2 在 R 中绘制多重响应调查项目?