【问题标题】:append values to data frame r for loop将值附加到数据帧 r for 循环
【发布时间】:2016-01-31 08:30:22
【问题描述】:

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

谢谢!

迈克尔

【问题讨论】:

  • 您需要考虑的一件事是,当您使用 k 作为迭代器从 1 循环到 100 时,“mat.k
  • 您的代码产生错误:Error in data.frame(X.val.1, true_val.k, diff.k, mat.k, (true_val.1 &lt; : object 'true_val.1' not found

标签: r for-loop dataframe append


【解决方案1】:

未测试:

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())

该代码有很多需要优化的地方。现在我只接受你的。
高温

附:
当您构建一个数据帧的代码产生错误时,以我的代码为例,即返回一个数据帧的函数,然后在我的代码末尾循环。

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 2017-10-21
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2021-10-03
    • 2016-12-19
    相关资源
    最近更新 更多