【发布时间】:2020-05-25 13:17:58
【问题描述】:
我试图找到合适的答案,但所有案例都比我所拥有的简单得多。 我需要根据我拥有的数据框中的日期信息创建一个 4 级(nov、end_feb、end_apr、其他)因子,然后将其添加为列。此外,我需要代码快速运行,因为我拥有的真实 df 超过 80 万行
这是我目前所拥有的 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"))))
}
我的问题与this one 不同,因为我的约会确实没有规律,而休息时间是针对特定分析的。
编辑 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
【问题讨论】:
-
嗨@zeebrah,你能提供一个小玩具数据集来测试你的功能吗?这将使您更容易理解您想要实现的目标
-
这能回答你的问题吗? Using R cut function on dates
-
@milanmft 添加了输入和输出示例。谢谢!
-
@machine,有点回答,但部分是,他们发布在那里的代码工作起来非常麻烦,而且仍然很慢
标签: r datetime dplyr lubridate