我cut2
优先使用的原因cut
是它默认的“右”是我期望它工作的方式(左闭区间)。查看代码,我看到当参数列表中存在“cuts”时,该cut
函数与一组移位的cuts一起使用,其效果是使间隔左闭,然后代码重新标记要更改的因子"("
's to 's ,["
但随后不使用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) )