我正在尝试在R中执行一个相当基本的操作,这给我带来了一些麻烦。
我有一个包含100次迭代的for循环,它在每次迭代中创建一个包含7个观察值的数据帧。我想以某种方式将每次迭代的结果附加到上一次迭代的结尾。因此,在最后一次迭代之后,结果将是一个包含700个观测值的数据框。
for(k in 1:100){
X = runif(200,-3,3)
X2 = X^2
e.1 = rnorm(200,0,0.2^2)
y.1 = cos(X)^2 + e.1
fit.1 = lm(y.1 ~ X + X2)
X.val.1=-3:3
X.val.2=X.val.1^2
mat.k=data.frame(rep(0,7), rep(0,7), rep(0,7))
true_val.k=rep(0,7)
diff.k=rep(0,7)
names(mat.k)[1]=paste("fitted value")
names(mat.k)[2]=paste("lower bound")
names(mat.k)[3]=paste("upper bound")
for(i in 1:7){
mat.k[i,]=predict(fit.1,data.frame(X=X[i],X2=X2[i]),interval="confidence")
true_val.k[i]=cos(X[i])^2+rnorm(1,0,0.2^2)
diff.k[i]=true_val.k[i]-mat.k[i,1]
}
mat.full.k=data.frame(X.val.1,true_val.k,diff.k,mat.k,(true_val.1 < mat.k[,3] & true_val.k > mat.k[,2])*1)
names(mat.full.k)[1]=paste("X")
names(mat.full.k)[2]=paste("true value")
names(mat.full.k)[3]=paste("difference")
names(mat.full.k)[7]=paste("cover")
}
我最初认为我可以创建100个单独的数据帧(mat.full.1,mat.full.2,mat.full.3,...),然后使用另一个for循环将它们组合在一起,但是R返回一个错误说明找不到对象'mat.full.1'。它能找到的唯一数据框是mat.full.k。
我想返回一个类似下面的数据框,但有700个观察结果,而不仅仅是最后的7个。
> mat.full.k
X true value difference fitted.value lower.bound upper.bound cover
1 -3 0.40681014 -0.04118873 0.4479989 0.3834096 0.5125881 1
2 -2 1.01834958 0.58296771 0.4353819 0.3649005 0.5058633 1
3 -1 0.98116822 0.54585026 0.4353180 0.3647855 0.5058504 1
4 0 0.12059332 -0.38227681 0.5028701 0.4241385 0.5816018 0
5 1 0.97424142 0.39806096 0.5761805 0.4505279 0.7018330 0
6 2 0.04907813 -0.43703754 0.4861157 0.4226798 0.5495515 0
7 3 0.41136178 -0.10964164 0.5210034 0.4399401 0.6020667 0
我搜索了一些论坛,并尝试使用list()函数,但没有运气。任何帮助将不胜感激。
谢谢!
迈克尔
答案 0 :(得分:0)
未经测试:
oneDF <- function() {
X = runif(200,-3,3)
X2 = X^2
e.1 = rnorm(200,0,0.2^2)
y.1 = cos(X)^2 + e.1
fit.1 = lm(y.1 ~ X + X2)
X.val.1=-3:3
X.val.2=X.val.1^2
mat.k=data.frame(rep(0,7), rep(0,7), rep(0,7))
true_val.k=rep(0,7)
diff.k=rep(0,7)
names(mat.k)[1]=paste("fitted value")
names(mat.k)[2]=paste("lower bound")
names(mat.k)[3]=paste("upper bound")
for(i in 1:7){
mat.k[i,]=predict(fit.1,data.frame(X=X[i],X2=X2[i]),interval="confidence")
true_val.k[i]=cos(X[i])^2+rnorm(1,0,0.2^2)
diff.k[i]=true_val.k[i]-mat.k[i,1]
}
mat.full.k=data.frame(X.val.1,true_val.k,diff.k,mat.k,(true_val.1 < mat.k[,3] & true_val.k > mat.k[,2])*1)
names(mat.full.k)[1]=paste("X")
names(mat.full.k)[2]=paste("true value")
names(mat.full.k)[3]=paste("difference")
names(mat.full.k)[7]=paste("cover")
mat.full.k
}
fullDF <- oneDF()
for (k in 2:100) fullDF <- rbind(fullDF, oneDF())
该代码需要进行优化。现在我只是拿你的。
HTH
P.S .:
当你构造一个数据帧的代码产生错误时,以我的代码为例,即返回一个数据帧的函数,然后是代码末尾的循环。