0

我正在尝试通过循环运行我的数据框,以在每一行上执行一个函数并更新列est、、llul结果。我的数据框是onch. est除了,ll和的结果ul对于每一行(大概是最后一次迭代)都相同之外,循环似乎正在工作。任何想法将不胜感激!

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]
}

数据框如下所示:

安琪

    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 复制问题,但这有效:

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

4 回答 4

1

您的行onch$ll <- b[1]会覆盖的整个llonch要仅更新特定条目,请使用onch$ll[ii] <- b[1]for some index ii

于 2012-12-26T20:37:33.687 回答
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)
于 2012-12-26T20:44:28.617 回答
0

我认为您可能会从以下问题和答案中受益:如何使用嵌套的 while-loop 优化以下代码?多核选项?

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

于 2012-12-26T20:09:27.947 回答
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]
于 2016-05-27T20:46:33.610 回答