#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 должен проходить через каждую строку и сам генерировать интервал. Я надеюсь, что это поможет и ответит на ваш комментарий!