Количество отчетов за неделю до события R

#r

Вопрос:

Я пытаюсь добавить столбец (AC_1_before) в свой фрейм данных, который подсчитывал бы количество отчетов за неделю (или две, три или четыре недели) до события в парке.

Мой фрейм данных в настоящее время выглядит так:

Представление(Reaction_per_park_per_day_3)

 Park Date Type_1_2 Coy_season AC_code Year Total_prior_AC  lt;chrgt; lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; 1 Airways Park 2019-01-14 1 1 3 2019 0 2 Airways Park 2019-01-16 0 1 2 2019 1 3 Airways Park 2019-01-24 0 1 2 2019 2 4 Auburn Bay 2021-03-02 1 1 1 2021 0 5 Auburn Bay 2021-03-03 0 1 1 2021 1 6 Auburn Bay 2021-05-08 0 1 1 2021 2 7 Bears Paw 2019-05-22 0 2 1 2019 0 8 Bears Paw 2019-05-22 0 2 2 2019 1  

Где Type_1_2 представляет конкретную реакцию, Coy_season относится к сезону, AC_code представляет лечение, а Total_prior_AC представляет общее количество событий, предшествующих отчету в парке.

С добавленной колонкой я хотел бы, чтобы мой фрейм данных выглядел следующим образом:

 Park Date Type_1_2 Coy_season AC_code Year Total_prior_AC AC_1_before  lt;chrgt; lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; 1 Airways Park 2019-01-14 1 1 3 2019 0 0  2 Airways Park 2019-01-16 0 1 2 2019 1 1 3 Airways Park 2019-01-24 0 1 2 2019 2 1 4 Auburn Bay 2021-03-02 1 1 1 2021 0 0  5 Auburn Bay 2021-03-03 0 1 1 2021 1 1 6 Auburn Bay 2021-05-08 0 1 1 2021 2 0 7 Bears Paw 2019-05-22 0 2 1 2019 0 0 8 Bears Paw 2019-05-22 0 2 2 2019 1 1  

Я попробовал это:

 library(lubridate) library(dplyr)  Reaction_per_park_per_day_4 lt;- Reaction_per_park_per_day_3 %gt;%   group_by(Park, Date) %gt;%   mutate(Start_date = min(Date)) %gt;%   group_by(Park, Date, Start_date) %gt;%  summarise(AC_1_before = sum(Date lt;= Start_date amp; Date gt;= Start_date - weeks(1)),  .groups = "drop")  

Это, похоже, не работает; хотя код выполняется, полученный результат неверен (я получаю 1, где должен получить 0, и суммы часто неверны). Группируя по парку и дате, я также группирую события, которые проводились в одном и том же парке и в один и тот же день, чего я не хочу делать.

Есть какие-нибудь идеи о том, как я мог бы это сделать?

Ответ №1:

Если я вас правильно понял, одним из способов сделать это может быть цикл for. Для простоты я создал новый фрейм данных:

 library(dplyr) library(lubridate) Reaction_per_park_per_day_3lt;-data.frame("Park" = c(rep("Airways Park", 3), rep("Auburn Bay", 3), rep("Bears Paw", 2)),  "Date" = as.POSIXct(c("2019-01-14", "2019-01-16", "2019-01-24", "2021-03-02", "2021-03-03", "2021-05-08", "2019-05-22", "2019-05-22")),  "Type_1_2" = c(1,0,0,1,0,0,0,0),  "Coy_season" = c(1,1,1,1,1,1,2,2),  "AC_code" = c(3,2,2,1,1,1,1,2),  "Year" = c(2019,2019,2019,2021,2021,2021,2019,2019),  "Total_prior_AC" = c(0,1,2,0,1,2,0,1))   for(i in 1:nrow(Reaction_per_park_per_day_3)) {  Reaction_per_park_per_day_3$AC_1_before[i] lt;- nrow(Reaction_per_park_per_day_3[0:(i-1),]%gt;%  filter(Park == Reaction_per_park_per_day_3$Park[i] amp;  Date %within% interval(Reaction_per_park_per_day_3$Date[i]-604800,  Reaction_per_park_per_day_3$Date[i])))  #604800 is # of seconds in a week }  

Поэтому для каждой строки подсчитайте количество строк, перед которыми в столбце «Парк» совпадают и находятся в интервале 7 дней от текущей строки. Я уверен, что есть лучший способ сделать это, но я думаю, что это может сработать!

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

1. Я думаю, это должно сработать. Однако мои фактические данные содержат более 800 строк с различными датами. Есть ли способ адаптировать код так, чтобы мне не нужно было вводить каждую отдельную дату?

2. @Gab_Laj Я изменил фрейм данных, который я сделал, чтобы лучше соответствовать вашим исходным данным. Возможно, я неправильно понимаю ваш комментарий, но я думаю, что если вы просто используете Reaction_per_park_per_day_3 свой фрейм данных, а не тот, который использовал я, то он должен работать со всеми 800 строками, так как цикл for должен проходить через каждую строку и сам генерировать интервал. Я надеюсь, что это поможет и ответит на ваш комментарий!