2012-12-26 50 views
0

我試圖通過循環運行我的數據框,以在每一行上執行一個函數,並使用結果更新列estllul。我的數據框是onch。循環似乎正在工作,除了est,llul的結果對於每行(可能是最後一次迭代)是相同的。任何想法,將不勝感激!R將數據附加到循環中的行

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複製的問題,但這個工程:

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

如何看起來像(例如,名稱(onch))? –

+1

你能分享一個數據樣本嗎?例如使用在以下網址解釋的原則:http://meta.stackexchange.com/questions/155375/embedding-data-from-csv-file-in-line-of-code/155377#155377 – Jochem

+0

我看到的第一個問題是你沒有用'i'來引用任何東西。所以你在'for'循環內執行相同的進程不變的行,因爲循環內沒有'i'。其次,因爲R是按副本分配的,所以當你可以創建一個數據幀時,你無需創建'nrow(onch)'副本。最後,什麼是「刪除」功能? –

回答

1

您的線路onch$ll <- b[1]會覆蓋整個整個llonch。要僅更新特定條目,請使用onch$ll[ii] <- b[1]作爲索引ii

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) 
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] 
相關問題