#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))