我有一个循环可以工作但不是当我尝试在函数中使用它时。 下面显示了循环之前和之后的数据框
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
答案 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
列V2
和V3
不相等的原因是原始循环代码中存在错误:您已写入DF[1,1]
,您可能会写{{1} }}