我正在尝试使用cut2()
中的Hmisc
package函数创建基于时间段的因子。
以下是一些代码:
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)
我期望创建间隔,使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]
我原以为选项minmax=TRUE
会确保hte cut包含data.points
中的所有值。
有人能澄清这里发生了什么吗?如何使用cut2函数生成包含数据中所有值的因子?
答案 0 :(得分:5)
我使用cut2
优先于cut
的原因是它的“right”默认值是我希望它工作的方式(左边闭合间隔)。看一下代码,我看到当参数列表中存在'cut'时,cut
函数与一组移位的切割一起使用,这些切割具有使左边闭合的间隔,然后是代码重新调整因子以将"("
更改为["
,但不会使用include.lowest = TRUE
。这具有将最后一个值转换为<NA>
的效果。 坦率地说,我认为这是一个错误。仔细观察后,我发现cut2
的帮助页面不承诺处理Date
或{{1}对象,所以“bug”太强了。它完全失败了Date对象,它似乎只是一个几乎与POSIXct对象一致的事故。 (这种实现对我来说有点令人惊讶,因为我总是认为它只是使用date-time
。)
您可以更改代码,我的一个想法是通过更改此行将范围扩展回原始数据中的右端点:
cut( ... , right=FALSE, include.lowest=TRUE)
到这一行:
r <- range(x, na.rm = TRUE)
这并不是我预期的结果,因为你在右端得到了一个新的类别,因为倒数第二个时间间隔仍在右边打开。
r <- range(c(x,max(x)+min(diff(x.unique))/2), na.rm = TRUE)
一个不同的想法给出了更令人满意的结果。只更改此行:
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) ...
对此:
y <- cut(x, k2)
给出预期的左右闭合间隔且没有NA:
y <- cut(x, k2, include.lowest=TRUE)
注意: 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) ...
= TRUE,右= FALSE,实际上会变为include.lowest
。在我不需要使用'right'参数做某些事情的时候,我正在摸不着为什么我实际上在这种情况下得到了理想的行为。我向Frank Harrell发送了一条消息,他愿意考虑修改代码以处理其他情况。我正在努力。
为什么这是一个问题:include.highest
和cut.POSIXt
的标签与cut.Date
(实际cut.numeric
)结果的标签不同。前两个标签策略只是重新设置间隔的开头,而cut.default
的标签包括“[”和“)”以及间隔的结尾。比较这些输出:
cut.numeric
答案 1 :(得分:1)
来自??cut2
:
minmax: 如果指定了切割但是min(x)< min(cut)或max(x)&gt; MAX(切割) 增加削减以包括最小和最大x
检查你的论点:
x=data.points
cuts=cut.points
r <- range(x, na.rm = TRUE)
(r[1] < min(cuts) | (r[2] > max(cuts)))
FALSE ## no need to include mean and max
所以这里设置minmax
不会改变结果。但是,通过设置cut
include.lowest=TRUE)
的结果
res <- cut(x=data.points, breaks=cut.points, include.lowest=TRUE)
table(is.na(res))