[英]Hmisc - cut2 - create factors from times
我正在尝试使用Hmisc
包中的cut2()
函数来基于时间段创建一个因子。
这是一些代码:
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 cuts包括data.points
所有值。
任何人都可以澄清这里发生了什么吗? 如何使用cut2函数生成一个包含数据中所有值的因子?
我优先使用cut2
进行cut
的原因是,它默认的“ right”是我期望它的工作方式(左封闭间隔)。 查看代码,我看到当参数列表中出现“ cuts”时, cut
函数与一组偏移的cuts一起使用,其效果是使间隔左向闭合,然后代码将因子重新标记为将"("
更改为["
,但是不使用include.lowest = TRUE
。这具有将最后一个值转换为<NA>
。 坦率地说,我将其视为错误。我更仔细地看到, cut2
的帮助页面不能保证处理Date
或date-time
对象,因此“ bug”太强了,对于Date对象它完全失败了,这似乎只是一次意外,几乎是(对于此实现,POSIXct对象是正确的。(这种实现方式令我有些惊讶,因为我始终以为只是使用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)
对此:
y <- cut(x, k2, include.lowest=TRUE)
给定预期的左右关闭间隔,不设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) ...
注意: include.lowest
= TRUE,right = FALSE,实际上将变为include.highest
。 而且,当我不需要使用“正确的”参数做某事时,为什么我在这种情况下实际上会得到所需的行为,我也正在摸索。 我向弗兰克·哈雷尔(Frank Harrell)发送了一条消息,他愿意考虑对代码进行修订以处理其他情况。 我正在努力。
为什么会出现此问题: cut.POSIXt
和cut.Date
的标签与cut.numeric
(实际上是cut.default
)的标签不同。 前两种标签策略只是重新间隔的开始,而来自cut.numeric
的标签包括“ [”和“)”以及间隔的结束。 比较这些输出:
levels( cut(0+1:100, 3) )
levels( cut(Sys.time()+1:100, 3) )
levels( cut(Sys.Date()+1:100, 3) )
从??cut2
:
minmax:如果指定了cuts,但min(x)<min(cuts)或max(x)> max(cuts),则增加cuts以包括min和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
不会更改结果。 但是这里通过设置include.lowest=TRUE)
使用cut
的结果:
res <- cut(x=data.points, breaks=cut.points, include.lowest=TRUE)
table(is.na(res))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.