我有一个数据集rfm
,其中有一个名为cohort
的列,类Date
,如下所示。我还有一个日历日期的向量,相当巧妙地命名为dates
,其元素也是类Date
:
> class(rfm)
[1] "tbl_df" "data.frame"
> class(rfm$cohort)
[1] "Date"
> class(dates)
[1] "Date"
rfm$cohort
和dates
都显示某个时间段内某个月的第一天的日期,dates
可能涵盖最近几个月。我的问题很简单:我只想查看max(rfm$cohort)
和max(dates)
之间有多少个月。
lubridate
包使interval()
函数变得简单,但该函数的参数必须是POSIXct
,而不是Date
个对象:
> as.period(interval(ymd(as.character(max(rfm$cohort))),ymd(as.character(max(dates)))), months)
[1] "1m 0d 0H 0M 0S"
但我是否真的需要对ymd()
和as.character()
进行链接调用? as.POSIXct()
不够吗?这是一个尝试:
> as.period(interval(as.POSIXct(max(rfm$cohort), tz = 'GMT'),as.POSIXct(max(dates), tz = 'GMT')), months)
Error in while (any(start + est * per < end)) est[start + est * per < :
missing value where TRUE/FALSE needed
这不起作用。 lubridate
似乎要我设置时间间隔的时区,而不是单独为其结束设置时区。像这样:
> as.period(interval(as.POSIXct(max(rfm$cohort)),as.POSIXct(max(dates)), tz = 'GMT'), months)
[1] "1m 0d 0H 0M 0S"
我知道这不是打字,所以我应该做lubridate
想要的,但为什么不单独设置间隔结束的时区也有效?通过我的阅读,?interval
表明该函数的第三个参数tzone
应默认从第一个时区获取其值。不知何故,as.POSIXct()
不会向interval()
显示时区,即使它在同一个调用中明确设置。我错过了什么?