dplyr мутирует формулу, ссылающуюся на предыдущие строки

#r #dplyr #formula #tidyr

Вопрос:

У меня есть df осадков, который выглядит так:

 # A tibble: 270,900 x 3  Sample.Date Gauge Rainfall  lt;dategt; lt;fctgt; lt;dblgt;  1 2016-02-01 563061 0  2 2016-02-01 563064 0  3 2016-02-01 563065 0  4 2016-02-01 563069 0  5 2016-02-01 563070 0  6 2016-02-01 563083 0  7 2016-02-01 563090 0  8 2016-02-01 563146 0  9 2016-02-01 563149 0 10 2016-02-01 566008 0 # ... with 270,890 more rows  

У меня есть около 134 датчиков дождя и данные о ежедневном количестве осадков для каждого из них.

Что я хочу сделать, так это создать новый столбец для каждого датчика, чтобы произвести расчет на основе расчета предыдущего дня. Что-то вроде:

 df %gt;% group_by(Gauge) %gt;% mutate(Rain_Calc = if_else(Sample.Date == "2016-01-02", "1.0", "") %gt;% #set Rain_Calc for Day 1 mutate(Rain_Calc = 0.7 * (Rainfall   Rain_Calc(Previous Day))  

Мой df начинается 01.02.2016. Я хочу, чтобы значение Rain_Calc в этот день (для всех датчиков) было равно 1,0.

Затем я хочу рассчитать значения «Расчет дождя» для остальных дней, которые проходят по списку (в последовательном порядке дат) и выполняют расчет. Мне также нужно, чтобы они были сгруппированы по датчикам.

Как я мог бы этого достичь?

Комментарии:

1. Можете ли вы привести небольшой пример из 10-15 строк и показать ожидаемый результат для него ?

Ответ №1:

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

 df %gt;% group_by(Gauge) %gt;% arrange(Sample.Date) %gt;% mutate(Rainfall.Lag1 = lag(Rainfall)) %gt;% mutate(Sample.Date.Lag1 = lag(Sample.Date)) %gt;% mutate(Rainfall.Lag1 = ifelse(as.double(difftime(Sample.Date, Sample.Date.Lag1, units="days")) == 1, Rainfall.Lag1, NA) %gt;% mutate(Rain_Calc = 0.7 * (Rainfall   Rainfall.Lag1)  

Комментарии:

1. Спасибо. кажется, это почти работает — я получаю ошибку «не удалось найти функцию Rain_Calc» в последней строке

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

Ответ №2:

Я не уверен, понял ли я ваш расчет, но я думаю, что накопление-это то, что вы ищете:

 library(tidyverse) library(purrr) set.seed(1) data lt;- tibble(date = rep(as.Date("2016-01-02") 0:2, 3),   gauge = rep(1:3,each=3),   rainfall = rgeom(9, 0.4))  data %gt;% group_by(gauge) %gt;%   arrange(date, .by_group = TRUE) %gt;%   mutate(rain_calc = accumulate(rainfall[-1], ~0.7*(.x .y),.init = 1))