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