Hmisc - cut2 - 创造因素

时间:2013-07-16 12:07:36

标签: r hmisc

我正在尝试使用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函数生成包含数据中所有值的因子?

2 个答案:

答案 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.highestcut.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))