问题描述
这个数据
> 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 重新做你的范围,你会看到你期望看到的。