我正在尝试使用包中的cut2()函数来创建基于时间段的因子.Hmisc
这是一些代码:
library(Hmisc)
i.time <- as.POSIXct("2013-07-16 13:55:14 CEST")
f.time <- i.time+as.difftime(1, units="hours")
data.points <- seq(from=i.time, to=f.time, by="1 sec")
cut.points <- seq(from=i.time, to=f.time, by="60 sec")
intervals <- cut2(x=data.points, cuts=cut.points, minmax=TRUE)
Run Code Online (Sandbox Code Playgroud)
我期望创建间隔,使data.point中的每个点都放在一个时间间隔内.但最后有一些NA值:
> tail(intervals, 1)
[1] <NA>
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... [2013-07-16 14:54:14,2013-07-16 14:55:14]
Run Code Online (Sandbox Code Playgroud)
我期待这个选项minmax=TRUE能确保hte cut包含所有的值data.points.
谁能澄清这里发生了什么?如何使用cut2函数生成包含数据中所有值的因子?
我cut2优先使用的原因cut是它的"right"的默认值是我期望它工作的方式(左闭合间隔).看一下代码,我看到当参数列表中存在'cut'时,该cut函数与一组移位的切割一起使用,这些切割具有使区间保持闭合的效果,然后代码重新调整因子以进行更改这"("是["'s,但后来没有用include.lowest = TRUE.这具有将最后一个值转换为的效果<NA>.坦率地说,我认为这是一个错误.在仔细观察之后,我看到cut2帮助页面不承诺处理任何一个Date或date-time对象,所以"bug"太强了.它完全失败了Date对象,它似乎只是一个几乎与POSIXct对象一致的事故.(这种实现对我来说有点令人惊讶,因为我总是认为它只是在使用它cut( ... , right=FALSE, include.lowest=TRUE).)
您可以更改代码,我有一个想法是通过更改此行将范围扩展回原始数据中的右端点:
r <- range(x, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)
到这一行:
r <- range(c(x,max(x)+min(diff(x.unique))/2), na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)
这并不是我预期的结果,因为你在右端获得了一个新的类别,因为倒数第二个时间间隔仍在右边打开.
intervals <- cut3(x=data.points, cuts=cut.points, minmax=TRUE)
> tail(intervals, 1)
[1] 2013-07-16 14:55:14
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...
> tail(intervals, 2)
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14) 2013-07-16 14:55:14
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...
Run Code Online (Sandbox Code Playgroud)
一个不同的想法给出了更满意的结果.仅更改此行:
y <- cut(x, k2)
Run Code Online (Sandbox Code Playgroud)
对此:
y <- cut(x, k2, include.lowest=TRUE)
Run Code Online (Sandbox Code Playgroud)
给出预期的右和左闭合间隔,没有NA:
tail(intervals, 2)
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14] [2013-07-16 14:54:14,2013-07-16 14:55:14]
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...
Run Code Online (Sandbox Code Playgroud)
注意:include.lowest= TRUE,右= FALSE,实际上会变为include.highest.在我不需要使用'right'参数做某些事情时,我正在摸不着为什么我实际上在这种情况下得到了理想的行为.我向Frank Harrell发送了一条消息,他愿意考虑修改代码以处理其他情况.我正在努力.
为什么这是一个问题:标签cut.POSIXt和(实际)结果cut.Date 的标签不同.前两个标签策略是仅重新开始间隔的开始,而标记来自包括"["和")"以及间隔的末尾.比较这些输出:cut.numericcut.defaultcut.numeric
levels( cut(0+1:100, 3) )
levels( cut(Sys.time()+1:100, 3) )
levels( cut(Sys.Date()+1:100, 3) )
Run Code Online (Sandbox Code Playgroud)