如何删除添加到由 base::cut() 创建的 bin 标签的多余的左范围端点?

问题描述

这个数据

> seq(0,1,0.1) -> x
> x
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

可以很好地归入带有对我的应用程序具有说明性的标签的类别中,但由于某种原因,我似乎无法摆脱该函数引入的额外(并且不需要?)左范围端点:>

> cut(x,breaks = 10,include.lowest = TRUE,right = TRUE,dig.lab=1)
 [1] [-0.001,0.1] [-0.001,0.1] (0.1,0.2]    (0.2,0.3]    (0.3,0.4]    (0.4,0.5]    (0.5,0.6]   
 [8] (0.6,0.7]    (0.7,0.8]    (0.8,0.9]    (0.9,1]     
10 Levels: [-0.001,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] (0.5,0.6] (0.6,0.7] ... (0.9,1]
> cut(x,right = FALSE,0.1) [0.1,0.2)    [0.2,0.3)    [0.3,0.4)    [0.4,0.5)    [0.5,0.6)    [0.6,0.7)   
 [8] [0.7,0.8)    [0.8,0.9)    [0.9,1]      [0.9,0.2) [0.2,0.3) [0.3,0.4) [0.4,0.5) [0.5,0.6) [0.6,0.7) ... [0.9,include.lowest = FALSE,dig.lab=1)
 [1] (-0.001,0.1] (-0.001,1]     
10 Levels: (-0.001,1)      [0.9,1)     
10 Levels: [-0.001,1)

对于我和我的数据,我不明白为什么据说第一类的范围还包括数据中不存在的 -0.0001。

有什么想法吗?为什么不简单地“[0-0.1]”?

弗雷德里克

解决方法

它在 manual 中有说明,当你想到它时,它有点逻辑(我的重点):

当breaks指定为单个数字时,数据范围为 分成等长的断片,然后是外界 移开范围的 0.1% 以确保极值 两者都在休息间隔内。

现在,如果您调试 cut 函数,并逐步执行它:

> debug( base:::cut.default )

您会看到不仅低端如此,高端也是如此。使用中的有效数字中断是:

Browse[2]> breaks
 [1] -0.001  0.100  0.200  0.300  0.400  0.500  0.600  0.700  0.800  0.900  1.001
Browse[2]> ch.br
 [1] "-0.001" "0.1"    "0.2"    "0.3"    "0.4"    "0.5"    "0.6"    "0.7"    "0.8"    "0.9"    "1"     

您要问的真正问题是,为什么我只在一端看到额外的 .001 东西,而在另一端看不到?

好吧,如果你回顾一下 cut.default 代码,你会看到它使用 formatC 来完成这项工作:

ch.br <- formatC(0 + breaks,digits = dig,width = 1L)

现在考虑:

> formatC( c(-0.001,1.001),digits=1,width=1 )
[1] "-0.001" "1"   

我不知道为什么 formatC 会这样做。 base::formatC 最后做了 .Internal(formatC(x,as.character(mode),width,digits,as.character(format),flag,i.strlen) ,此时我停止挖掘。

您可以轻松创建自己的不使用 cut()formatC 函数。它可能仍然应该向左和向右添加间隔,但它不需要显示在标签中,这才是真正的问题所在。只需获取 base:::cut.default 中的代码并交换必要的几行(最好在之后发布)

否则,我认为 cut 不会被使用得最多(这可以解释为什么这种不一致在今天仍然存在)

如果你从 1 到 2 重新做你的范围,你会看到你期望看到的。