Цикл для добавления дополнительных столбцов работает, но не в функции - PullRequest
0 голосов
/ 22 марта 2012

У меня есть цикл, который работает, но не когда я пытаюсь использовать его в функции. Ниже показан кадр данных до и после циклов

DF

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

Loop

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 после функции с циклом, должен быть дополнительный столбец с теми же значениями, что и столбец 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 Ответ

3 голосов
/ 22 марта 2012

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], где вы предположительно намеревались написать DF[i,1].

...