R将数据附加到循环中的行

时间:2012-12-26 20:00:43

标签: r loops

我正在尝试通过循环运行数据框以在每一行上执行函数,并使用结果更新列estllul。我的数据框是onch。循环似乎正在起作用,但estllul的结果对于每一行都是相同的(可能是最后一次迭代)。任何想法都将不胜感激!

for (i in 1:nrow(onch)) {
   row <- cbind(onch$c1, onch$c2, onch$c3)
   pr1 <- removal(row)
   a <- summary(pr1)
   onch$est <- a[1]
   b <- confint(pr1)
   onch$ll <- b[1]
   onch$ul <- b[2]
}

数据框如下所示:

  

onch

    site    date      c1   c2  c3   est   ll   ul
1   H1     7/11/12    6     2   1   NA     NA   NA
2   H2     7/15/12    12    4   0   NA     NA   NA

谢谢你的帮助!我仍然没有解决nrow copy问题,但这有效:

for (i in 1:nrow(onch)) {

row <- cbind(onch$c1[i], onch$c2[i], onch$c3[i])
pr1<- removal(row)
a<- summary(pr1)
    onch$est[i] <- a[1]
b <- confint(pr1)
    onch$ll[i] <- b[1]
    onch$ul[i] <- b[1,2]
 }

4 个答案:

答案 0 :(得分:1)

您的第onch$ll <- b[1]行会覆盖ll整个onch。要仅更新特定条目,请使用onch$ll[ii] <- b[1]作为某个索引ii

答案 1 :(得分:0)

我认为您可以从以下问题和答案中受益:How to optimize the following code with nested while-loop? Multicore an option?

这个问题讨论了许多相关原则,并指出了如何优化(矢量化)代码以改进执行。

答案 2 :(得分:0)

我将对此答案进行编辑以解释它。在此期间,试一试。我没有FSA软件包(install.packages正在向我大声说它不适用于R 2.15.2),所以我没有对它进行测试。

onch.removal <- lapply(1:nrow(onch),function(x) {
    pr1 <- removal(c(onch[x,"c1"],onch[x,"c2"],onch[x,"c3"]))
    return(list(est=summary(pr1)[[1]],ll=confint(pr1)[1],ul=confint(pr1)[2]))
})
onch <- data.frame(onch,onch.removal)

答案 3 :(得分:0)

使用data.table有一个快速解决方案,无需循环。

library(data.table)
library(FSA)

setDT(onch)

onch[, v_est := summary(removal(c(c1, c2, c3)))[1] , by= site]
onch[, v_ll := confint(removal(c(c1, c2, c3)))[1] , by= site]
onch[, v_ul := confint(removal(c(c1, c2, c3)))[1,2] , by= site]