如何将结果列绑定到 for 循环中的数据框?
How to bind resultant columns to a data frame in for loop?
我想对 12 次迭代执行蒙特卡洛模拟,均值在 5 到 60 之间变化,间隔为 5。作为以下代码的输出,我希望每个模拟结果在不同的列中作为数据框。例如,如果我想对每组均值和 std.dev 执行 10,000 次模拟,生成的数据框将有 12 列和 10000 行。
代码是:
df<-data.frame()
for (i=5; i<=60; i=i+5)
{
{
cvsq=1
mcs=rnorm(10000,i,(i*cvsq))
op$i<-data.frame(mcs)
}
df<-cbind(op)
}
df
此代码的结果是一个包含两列的数据框,其中仅包含 60 和 5 的模拟结果。
您的代码非常C++
专注。我包含了一个 R
版本,所以你可以添加你想要的或者写一个新的。
#Create ranges and list
vec <- seq(5,60,by=5)
List <- list()
#Loop
for(j in 1:length(vec))
{
for (i in vec)
{
cvsq=1
mcs=rnorm(10000,i,(i*cvsq))
index <- i
List[[j]]<-data.frame(index,mcs)
}
}
List
您可以使用 sapply
:
sd <- 1
out <- sapply(seq(5, 60, 5), rnorm, n = 10000, sd = sd)
dim(out)
#[1] 10000 12
可以使用 lapply
和 do.call
DF <- do.call(cbind,
lapply(seq(5,60,5), function(i) setNames(data.frame(rnorm(10000, i, (i*cvsq))), i))
)
head(DF)
5 10 15 20 25 30 35 40 45 50 55 60
1 2.621 9.3083 7.004 -20.4034 43.77 -6.906 15.68 60.42 -30.981 55.634 -2.329 156.45
2 3.490 -4.1331 9.461 24.7668 15.06 69.660 15.48 132.71 21.109 8.984 84.382 63.27
3 4.863 -0.8772 3.649 0.2247 14.01 16.365 81.56 -19.01 27.993 15.910 13.690 106.21
4 4.516 17.0948 -2.754 9.7998 37.01 76.459 56.19 26.39 80.759 54.173 13.152 34.03
5 11.110 16.7807 39.529 -2.9710 -11.61 -10.982 68.50 48.68 53.811 30.779 78.196 -36.90
6 -3.297 1.0127 15.150 37.9734 11.31 45.855 58.18 22.91 5.654 66.101 -35.472 68.05
我想对 12 次迭代执行蒙特卡洛模拟,均值在 5 到 60 之间变化,间隔为 5。作为以下代码的输出,我希望每个模拟结果在不同的列中作为数据框。例如,如果我想对每组均值和 std.dev 执行 10,000 次模拟,生成的数据框将有 12 列和 10000 行。 代码是:
df<-data.frame()
for (i=5; i<=60; i=i+5)
{
{
cvsq=1
mcs=rnorm(10000,i,(i*cvsq))
op$i<-data.frame(mcs)
}
df<-cbind(op)
}
df
此代码的结果是一个包含两列的数据框,其中仅包含 60 和 5 的模拟结果。
您的代码非常C++
专注。我包含了一个 R
版本,所以你可以添加你想要的或者写一个新的。
#Create ranges and list
vec <- seq(5,60,by=5)
List <- list()
#Loop
for(j in 1:length(vec))
{
for (i in vec)
{
cvsq=1
mcs=rnorm(10000,i,(i*cvsq))
index <- i
List[[j]]<-data.frame(index,mcs)
}
}
List
您可以使用 sapply
:
sd <- 1
out <- sapply(seq(5, 60, 5), rnorm, n = 10000, sd = sd)
dim(out)
#[1] 10000 12
可以使用 lapply
和 do.call
DF <- do.call(cbind,
lapply(seq(5,60,5), function(i) setNames(data.frame(rnorm(10000, i, (i*cvsq))), i))
)
head(DF)
5 10 15 20 25 30 35 40 45 50 55 60
1 2.621 9.3083 7.004 -20.4034 43.77 -6.906 15.68 60.42 -30.981 55.634 -2.329 156.45
2 3.490 -4.1331 9.461 24.7668 15.06 69.660 15.48 132.71 21.109 8.984 84.382 63.27
3 4.863 -0.8772 3.649 0.2247 14.01 16.365 81.56 -19.01 27.993 15.910 13.690 106.21
4 4.516 17.0948 -2.754 9.7998 37.01 76.459 56.19 26.39 80.759 54.173 13.152 34.03
5 11.110 16.7807 39.529 -2.9710 -11.61 -10.982 68.50 48.68 53.811 30.779 78.196 -36.90
6 -3.297 1.0127 15.150 37.9734 11.31 45.855 58.18 22.91 5.654 66.101 -35.472 68.05