Суммировать первые X строк столбца? - PullRequest
0 голосов
/ 05 ноября 2018

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

library(data.table)

df <- data.frame(
  dept = c(rep('FIREDEPT', 5), rep('WATERDEPT', 5)),
  month = 201808:201812,
  initial_stock = sample(75884:85347, 10),
  variable_predicted = sample(50000:100000, 10))


df <- mutate(df, calculation = ifelse(initial_stock <= (shift(variable_predicted, type="lead", fill = 0)
                                                        + shift(variable_predicted, type="lead", fill = 0, n = 2)
                                                        + shift(variable_predicted, type="lead", fill = 0, n = 3)),
                                      (3 + (initial_stock 
                                            - shift(variable_predicted, type="lead", fill = 0) 
                                            - shift(variable_predicted, type="lead", fill = 0, n = 2)
                                      ) / shift(variable_predicted, type="lead", fill = 0, n = 3)) * 30,
                                      0)) 

Дело в том, что ведущее значение намного больше, и я должен сделать это в серии ifelses для нескольких формул. Есть ли способ получить результат этой части:

(shift(variable_predicted, type="lead", fill = 0)
  + shift(variable_predicted, type="lead", fill = 0, n = 2)
  + shift(variable_predicted, type="lead", fill = 0, n = 3)),

без использования серии смен?

1 Ответ

0 голосов
/ 05 ноября 2018

shift векторизовано, поэтому вы можете задать вектор для n, а затем добавить результаты вместе с Reduce('+', ...)

a <- 
with(df,
     (shift(variable_predicted, type="lead", fill = 0)
  + shift(variable_predicted, type="lead", fill = 0, n = 2)
  + shift(variable_predicted, type="lead", fill = 0, n = 3)))

b <- 
with(df,
     Reduce(`+`, shift(variable_predicted, n = 1:3, fill = 0, type = 'lead')))


identical(a, b)
# [1] TRUE

Вы также можете достичь этого с zoo:rollsum

library(zoo)
d <- 
with(df, 
  rollsum(c(variable_predicted[-1], rep(0, 3)), 3))

all.equal(a, d)
# [1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...