将 tibble 中的日期更改为分类变量

Change dates within a tibble to a categorical variable

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

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

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

**编辑:我在下面添加了我的代码以及我尝试这样做的方式。诚然,实现它有点迂回,但这是我能想到的方法。我从我的订购日期列 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,其中包含 class DateDate 列,您可以使用 cut,休息时间为 15 天.

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

例子-

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