我正在处理一个相当大的数据集,并试图使用mixor
函数运行混合效果多级回归。有人建议我将日期转换为分类变量,因为当前的格式需要相当长的时间来运行。我的数据存储在标题栏"arr_full"中,日期作为标题栏中的一列存储为"rec_date"作为POSIXct数据类型。
我不想改变任何行的顺序,并且认为可能有一些方法可以简单地使用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, '15 days',labels = FALSE)