将小标题中的日期更改为分类变量

问题描述

我正在处理一个相当大的数据集,并尝试使用 mixor 函数运行混合效果多级回归。我被建议将日期切换到分类变量,因为当前格式需要相当长的时间才能运行。我的数据存储在tibble“arr_full”中,日期作为该tibble中的一列存储为POSIXct数据类型的“rec_date”。

我不想更改任何行的顺序,并认为可能有某种方法可以简单地使用 lubridate 来做到这一点。基本上,我希望将每个月 15 天以内的任何日期存储为分类变量。因此,2020 年 4 月 15 日至 30 日之间的任何日期将是“1”,2020 年 5 月 1 日至 14 日为“2”,依此类推,直到 2021 年 4 月 1 日至 14 日作为最后一个类别“24”。

我对 R 还很陌生,所以任何关于如何解决这个问题以及为什么会非常有帮助的解释。 在此先感谢您的帮助!

**edit:我已经按照我尝试这样做的方式在下面添加了我的代码。诚然,实现它有点迂回,但这是我能想到的方法。我从我订购的日期列 rec_date 中创建了一个单独的列,并创建了 rec_date1,我想用指定的变量替换它。 运行代码时没有出现任何错误,但是当我运行 arr_full$rec_date1 时,它仍然输出原始日期,而不是替换的变量。

arr_full$rec_date1 <- ifelse(lubridate::month(arr_full$rec_date1) ==4 & lubridate::day(arr_full$rec_date1) >=15,1,ifelse(lubridate::month(arr_full$rec_date1) ==5 & lubridate::day(arr_full$rec_date1) <15,2,ifelse(lubridate::month(arr_full$rec_date1) ==5 & lubridate::day(arr_full$rec_date1) >=15,3,ifelse(lubridate::month(arr_full$rec_date1) ==6 & lubridate::day(arr_full$rec_date1) <15,4,ifelse(lubridate::month(arr_full$rec_date1) ==6 & lubridate::day(arr_full$rec_date1) >=15,5,ifelse(lubridate::month(arr_full$rec_date1) ==7 & lubridate::day(arr_full$rec_date1) <15,6,ifelse(lubridate::month(arr_full$rec_date1) ==7 & lubridate::day(arr_full$rec_date1) >=15,7,ifelse(lubridate::month(arr_full$rec_date1) ==8 & lubridate::day(arr_full$rec_date1) <15,8,ifelse(lubridate::month(arr_full$rec_date1) ==8 & lubridate::day(arr_full$rec_date1) >=15,9,ifelse(lubridate::month(arr_full$rec_date1) ==9 & lubridate::day(arr_full$rec_date1) <15,10,ifelse(lubridate::month(arr_full$rec_date1) ==9 & lubridate::day(arr_full$rec_date1) >=15,11,ifelse(lubridate::month(arr_full$rec_date1) ==10 & lubridate::day(arr_full$rec_date1) <15,12,ifelse(lubridate::month(arr_full$rec_date1) ==10 & lubridate::day(arr_full$rec_date1) >=15,13,ifelse(lubridate::month(arr_full$rec_date1) ==11 & lubridate::day(arr_full$rec_date1) <15,14,ifelse(lubridate::month(arr_full$rec_date1) ==11 & lubridate::day(arr_full$rec_date1) >=15,15,ifelse(lubridate::month(arr_full$rec_date1) ==12 & lubridate::day(arr_full$rec_date1) <15,16,ifelse(lubridate::month(arr_full$rec_date1) ==12 & lubridate::day(arr_full$rec_date1) >=15,17,ifelse(lubridate::month(arr_full$rec_date1) ==1 & lubridate::day(arr_full$rec_date1) <15,18,ifelse(lubridate::month(arr_full$rec_date1) ==1 & lubridate::day(arr_full$rec_date1) >=15,19,ifelse(lubridate::month(arr_full$rec_date1) ==2 & lubridate::day(arr_full$rec_date1) <15,20,ifelse(lubridate::month(arr_full$rec_date1) ==2 & lubridate::day(arr_full$rec_date1) >=15,21,ifelse(lubridate::month(arr_full$rec_date1) ==3 & lubridate::day(arr_full$rec_date1) <15,22,ifelse(lubridate::month(arr_full$rec_date1) ==3 & lubridate::day(arr_full$rec_date1) >=15,23,ifelse(month(arr_full$rec_date1) ==4 & day(arr_full$rec_date1) <15,24,NA)))))))))))))))))))))))

> arr_full$rec_date1
   [1] "2020-06-12 GMT" "2020-07-25 GMT" "2020-09-04 GMT" "2020-12-07 GMT" "2020-06-12 GMT" "2020-07-25 GMT"
   [7] "2020-09-07 GMT" "2020-12-07 GMT" "2021-03-11 GMT" "2020-06-12 GMT" "2020-07-25 GMT" "2020-09-08 GMT"
  [13] "2020-12-07 GMT" "2021-03-08 GMT" "2020-06-20 GMT" "2020-07-26 GMT" "2020-06-20 GMT" "2020-09-11 GMT"...

解决方法

如果您的数据名为 df,其中包含 Date 类的 Date 列,您可以使用 cut 并将中断设为 15 天。

df$group <- cut(df$Date,'15 days',labels = FALSE)

示例 -

x <- Sys.Date() + 1:365
y <- cut(x,labels = FALSE)