循环以添加额外的列工作,但不在函数中

时间:2012-03-22 09:15:58

标签: r function loops

我有一个循环可以工作但不是当我尝试在函数中使用它时。 下面显示了循环之前和之后的数据框

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) 
    }
}
}
使用Loop函数后的DF,应该有一个额外的列,其值与第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

1 个答案:

答案 0 :(得分: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],您可能会写{{1} }}