将 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 Date
的 Date
列,您可以使用 cut
,休息时间为 15 天.
df$group <- cut(df$Date, '15 days',labels = FALSE)
例子-
x <- Sys.Date() + 1:365
y <- cut(x, '15 days',labels = FALSE)
我正在处理一个相当大的数据集,并尝试使用 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 Date
的 Date
列,您可以使用 cut
,休息时间为 15 天.
df$group <- cut(df$Date, '15 days',labels = FALSE)
例子-
x <- Sys.Date() + 1:365
y <- cut(x, '15 days',labels = FALSE)