Временные ряды - добавление данных роста по строкам последовательно - PullRequest
1 голос
/ 20 января 2020

Я новичок (я sh) в R и ищу помощь с вопросом. Я много раз искал в stackoverflow аналогичный вопрос, но вполне возможно, что я искал, используя неправильные слова.

То, что я хотел бы сделать, это в простых терминах, сделать уравнение последовательно по строкам с трубы dplyr, такие, что результат в одной строке зависит от значения в строке перед ним.

Для целей этого обсуждения я создал образец фрейма данных (именованный, пример):

> sample
# A tibble: 10 x 4
    year variable variable_growth_rates other_growth_rates
   <dbl>    <dbl>                 <dbl>              <dbl>
 1  2010    20000              NA                   NA    
 2  2011    23450               0.173                0.15 
 3  2012    25110               0.0708               0.12 
 4  2013    25350               0.00956              0.105
 5  2014    24920              -0.0170               0.075
 6  2015    25010               0.00361              0.05 
 7  2016       NA              NA                    0.025
 8  2017       NA              NA                    0.032
 9  2018       NA              NA                    0.041
10  2019       NA              NA                    0.071

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

Я могу сделать длинную форму:

##### Append Growth rates from variable other_growth_rates to our historical data in variable
sample_rvsd <- sample %>%
  mutate(variable_rvsd = ifelse(!is.na(variable), 
variable, lag(variable)*(1+other_growth_rates))) %>%
  mutate(variable_rvsd = ifelse(!is.na(variable), variable, lag(variable)*(1+other_growth_rates))) %>%  
  mutate(variable_rvsd = ifelse(!is.na(variable), variable, lag(variable)*(1+other_growth_rates))) %>% 
  mutate(variable_rvsd = ifelse(!is.na(variable), variable, lag(variable)*(1+other_growth_rates)))

Это хорошо, если есть только несколько лет и одна переменная, но мне нужно сделать это с несколькими переменными и более чем на десять с лишним лет. Это также проблема, с которой я часто сталкиваюсь, поэтому я вижу, что мой код запутывается в спешке.

Я попытался написать функцию, которая, по моему мнению, была бы оптимальной (поскольку я должен делать это часто) , Опять же, мои навыки не велики:

Напишите функцию append_growth
# Function
append_growth <- function(x, y) {
  for (i in seq_along(x)) {
    x_new <- ifelse(!is.na(x), x, lag(x) * y)
  }
}

##### Apply growth rates function
sample_rvsd_fail <- sample %>%
  mutate(variable_rvsd = append_growth(variable, other_growth_rates))

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 января 2020

Есть много способов go сделать это, поэтому ниже приведен только один ответ с использованием базы R. Я сделал это на базе, потому что это наиболее близко напоминало то, как вы начали. Вы упомянули желание сделать это в dplyr, что было бы отличным способом go по этому поводу. Ознакомьтесь с документацией mutate_at / mutate_if .

sample <- data.frame(year = c(2010:2019),
                     variable = c(20000, 23450, 25110, 25350, 24920, 25010, NA, NA, NA, NA),
                     variable_growth_rates = c(NA, .173, .0708, .00956, -.0170, .00361, NA, NA, NA, NA),
                     other_growth_rates = c(NA, .15, .12, .105, .075, .05, .025, .032, .041, .071))


append_growth <- function(data, variable, rate){
  for(x in 1:nrow(data)){
    data[x, variable] <- ifelse(is.na(data[x, variable]), 
                                    (data[x-1, variable]*(1+data[x, rate])), data[x, variable])
  }
  data
}

df <- append_growth(sample, "variable", "other_growth_rates")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...