将值附加到数据帧r for循环

时间:2015-10-30 20:03:44

标签: r for-loop dataframe append

我正在尝试在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()函数,但没有运气。任何帮助将不胜感激。

谢谢!

迈克尔

1 个答案:

答案 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 .:
当你构造一个数据帧的代码产生错误时,以我的代码为例,即返回一个数据帧的函数,然后是代码末尾的循环。