2012-03-22 40 views
0

我有一個循環,但我嘗試在函數中使用它時不起作用。 的下面示出了數據幀DF循環添加額外的列工作,但不是在函數中時

MSU 
1 12 
2 11 
3 6 
4 5 
5 6 
6 6 

環路之前和環

for (i in 1:nrow(DF)) 
{ 
    if(i<4) { DF[ i, 2 ] <- 0} else 
    { 
     DF[ i, 2 ] <- ((DF[1,1] + DF[i-1,1] + DF[i-2,1] + DF[i-3,1])/4) 
    } 
} 

DF循環後,一個額外的列已被添加與平均值的最後四個值中的除非值的數量少於四個。

MSU V2 
1 12 0.00 
2 11 0.00 
3 6 0.00 
4 5 10.25 
5 6 8.50 
6 6 7.25 

功能的環路

myfct <- function(DF){ 
for (i in 1:nrow(DF)) 
{ 
    if(i<4) { DF[ i, 3 ] <- 0} else 
    { 
     DF[ i, 3 ] <- ((DF[i,1] + DF[i-1,1] + DF[i-2,1] + DF[i-3,1])/4) 
    } 
} 
} 

DF與循環函數之後,應該用BA作爲柱2相同的值的額外的列,但它不被添加。我使用print來顯示循環正在執行,並且這些值是我期望在第3列中輸入的值。

MSU V2 
1 12 0.00 
2 11 0.00 
3 6 0.00 
4 5 10.25 
5 6 8.50 
6 6 7.25 

回答

3

R通過值傳遞參數,而不是通過引用。這意味着當你將一個對象傳遞給一個函數時,R會創建該對象的本地副本。您對該函數內的對象所做的任何更改只會影響本地副本,而不會影響原始副本。

要修改DF您需要讓您的函數返回新修改的數據框,並用它覆蓋舊值DF

要做到這一點,你添加一行return(DF)在你的函數結束,然後用

DF <- myfct(DF) 

導致

> DF 
    MSU V2 V3 
1 12 0.00 0.00 
2 11 0.00 0.00 
3 6 0.00 0.00 
4 5 10.25 8.50 
5 6 8.50 7.00 
6 6 7.25 5.75 

的原因,列V2V3都叫它不等於您的原始循環代碼中存在一個錯誤:您寫了DF[1,1],您大概打算編寫DF[i,1]

相關問題