#r #if-statement #optimization
#r #оператор if #оптимизация
Вопрос:
Я работаю с набором данных с информацией о городах с Covid, и я хотел бы добавить переменную, если город x на дату t был в карантине, я создал код ifelse, но для имеющихся у меня 2,3 ММ наблюдений требуется много времени.
Мой набор данных выглядит следующим образом
City Date
a 2020-03-04
b 2020-03-04
a 2020-03-05
b 2020-03-05
a 2020-03-06
b 2020-03-06
a 2020-03-07
b 2020-03-07
И мой код таков
library(data.table
df <- df %>%
mutate(quarantine = 0)
df <- df %>%
mutate(quarantine = fifelse(City = "a",
fifelse(Date > as.Date("2020-03-04") amp;
Date <= as.Date("2020-03-06"), 1, 0),
quarantine) %>%
mutate(quarantine = fifelse(City = "b",
fifelse(Date > as.Date("2020-03-05") amp;
Date <= as.Date("2020-03-07"), 1, 0),
quarantine)
И это повторяется до тех пор, пока я не заполню 34 города, которые у меня есть, это действительно длинный код, но я не знаю, как его оптимизировать, потому что у каждого города своя дата для карантина, поэтому я не знаю, смогу ли я его зациклить.
Спасибо за помощь
Комментарии:
1. Где у вас есть даты карантина? Я не понимаю 2 сравнения: разве> 2020-03-05 amp; <=2020-03-06 не совпадает с == 2020-03-06? Для начала вы должны векторизовать свой код (без ifelse) и, по мере загрузки
data.table
, просто использоватьdata.table
код, а не смешивать сdplyr
2. Даты карантина я взял из википедии.
3. тогда я думаю, что прежде всего вам нужно поместить их в data.frame city / quarantineStartDate / quarantineEndDate, который вы можете использовать, чтобы избежать 34 строк кода
4. А затем код для поиска, находится ли дата между этими датами?
5. да, векторизованный (без ifelses)