Я думаю, что суть вашего вопроса в том, как векторизовать вычисления, но, в конечном счете, вы не сможете, если одна строка является функцией результата предыдущей строки. Есть несколько быстрых накопительных функций, встроенных в базу (cumsum
, cumprod
, cummax
, cummin
), но я предполагаю, что они используют цикл C или C ++ под капотом. Если по какой-то случайности вы можете преобразовать вычисление в функцию с начальным значением x
, это может позволить вам векторизовать функцию. Например, в предоставленных вами фиктивных данных это просто экспоненциальный рост, который может быть выражен как
tibble(x=c(1:10),y=c(1.05)) %>%
mutate(x = 1*y^(x-1))
, как это было предложено в предыдущем ответе
Если ваш вопрос заключается в том, как этовычисление в сценарий стиля трубы, тогда единственное требование к выражению, предоставленному mutate
, состоит в том, чтобы он возвращал вектор либо длины 1, либо одинаковой длины числа строк в группе. Таким образом, вы можете сделать что-то вроде этого:
tibble(x=c(1:10),y=c(1.05)) %>%
mutate(x = {
out <- x[1]
for(i in seq(2, NROW(x))) {
out[i] = out[i-1] * 1.05
}
out
})