r: функция с лагом, работающим между строками, а не столбцами - PullRequest
0 голосов
/ 10 февраля 2019

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

df1<- data.frame(var1=rnorm(10,3,2), var2= rnorm(10, 4, 3))
df1$carryover<- lag(df1$var1, 1, default = 0)*(.5) + df1$var1
>df1

     var1       var2     carryover
1   3.2894474  2.0839128 3.2894474
2   3.6059389  7.8880658 5.2506625
3  -1.4274057  6.2763882 0.3755637
4   3.8531253  3.2653448 3.1394225

Моя функция пытается сделать то же самое, но для нескольких разных ресурсов, см. Ниже:

carryover<- function(x){
  result_df<- data.frame(x)
  xnames<- names(x)
  for (i in 1:7){
    result_column<- lag(x, 1, default = 0)*(i/10) + x
    result_column_name<- paste(xnames, i, sep= "_")
    result_df[result_column_name] <- result_column
  }
  return(result_df)
}

Когда я запускаюcarryover(df1), df$var1 остается одинаковым на всех итерациях, в то время как df1$var2 принимает значения запаздывания для строк, когда я стремлюсь к столбцам.Что структурно неправильно в моей функции, которая заставляет ее не возвращать запаздывание значений столбца?

1 Ответ

0 голосов
/ 06 марта 2019

Немного поработал над этим, используя обратную связь от Stackoverflow и придумав следующее решение, определив функцию carryover в более крупной функции, затем используя apply с MARGIN=2 для вычисления по столбцу:

adStock<- function(x){
  # create datafame to store results in
  result_df<- data.frame(x)
  # assign names to be applied as a column
  xnames<- names(x)
  # create list of carryovers
  carryovers<- seq(.1, .7, .1)
  # create carryover function
  carryover<- function(x){
    x + dplyr::lag(x, 1, default = 0)*(i)
  }
  # run for loop across all carryover values
  for (i in carryovers){
    result_column<- apply(x, 2, carryover)
    result_column_name<- paste(xnames, i, sep= "_")
    result_df[result_column_name] <- result_column
  }
  return(data.frame(result_df))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...