我正在尝试通过循环运行数据框以在每一行上执行函数,并使用结果更新列est
,ll
和ul
。我的数据框是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]
}
数据框如下所示:
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]
}
答案 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]