Я пытался найти подходящий ответ, но все представляют гораздо более простые случаи, чем то, что у меня есть. Мне нужно создать четырехуровневый (nov, end_feb, end_apr, другой) фактор на основе информации о дате в имеющемся у меня фрейме данных, а затем добавить его в качестве столбца. Более того, мне нужен код для go быстро, так как реальный df, который у меня есть, составляет более 800 тысяч строк
Вот что у меня есть с lubridate и %within%
. Он действительно работает, но работает очень медленно из-за неэффективности, поскольку мне приходится прибегать к созданию нового столбца с sapply(df, sub_period_gen(date))
. В оптимальном случае мне нужен способ обеспечить векторизацию решения, поскольку у меня есть некоторые другие генераторы факторов, которые работают с тем же фреймом данных, а также работают медленно
sub_period_gen <- function(x){
i_1 <- ymd("2019-11-01")%--% ymd("2019-11-30")
i_2 <- ymd("2020-02-24")%--% ymd("2020-02-29")
i_3 <- ymd("2020-04-24")%--% ymd("2020-04-30")
if (x %within% i_1){
return("nov") # return case one
} else if (x %within% i_2){
return("end_feb") # return case two
} else if (x %within% i_3){
return("end_apr") # return case three
} else{
return("other") # return case four
}
}
Заранее спасибо!
РЕДАКТИРОВАТЬ: Я несколько оптимизировал решение, но оно по-прежнему выглядит неоптимальным и его очень сложно изменить. Кроме того, я переместил интервалы в глобальную среду
sub_period_gen <- function(x){
return(ifelse(x %within% i_1,"nov",ifelse(x %within% i_2,"end_feb",ifelse(x %within% i_3,"end_apr","other"))))
}
Мой вопрос отличается от этого , так как в моей дате действительно нет регулярности, а перерывы предназначены для конкретного анализа.
РЕДАКТИРОВАТЬ 2: пример ввода:
library(lubridate)
toy <- tibble(date = ymd("2019-11-12","2020-03-11","2020-01-31","2019-12-19","2019-12-04","2020-01-21","2020-01-31","2020-02-16",
"2020-02-28","2020-03-20","2020-02-08","2020-03-23","2020-01-22","2020-02-18","2020-03-19","2019-11-22",
"2020-01-14","2020-03-04","2019-12-02","2019-11-03","2020-02-27","2020-02-13","2019-11-17","2020-03-17",
"2020-04-14","2019-12-19","2019-11-05","2020-01-11","2020-04-25","2019-11-24"))
желаемый результат:
> date sub_period
> <date> <chr>
> 1 2019-11-12 nov
> 2 2020-03-11 other
> 3 2020-01-31 other
> 4 2019-12-19 other
> 5 2019-12-04 other
> 6 2020-01-21 other
> 7 2020-02-29 end_feb
> 8 2020-02-16 other
> 9 2020-04-28 end_apr