我正在使用cut()
对从负值到正值的列表进行分类,增量为0.05。但是,在-0.05到0.05的范围内处理零会根据切割函数中使用的范围(参见下面的示例)而变化,因此我得到[-0.05,0},[0,0.05]或[-0.05, 2.8e-17),[2.8e-17,0.05)。我的偏好是将零显示为0。
对于我的预期目的,我希望具有足够通用的范围,以便它可以处理我提供的任何列表中的范围。我使用了dig.lab
,使用了显式断点而不是seq()
,但这没有用,或者至少在Win7 64位机器上设置R v3.0.2。
我确信我错过了一些明显的东西,但我无法弄明白。非常感谢任何帮助或指导。非常感谢提前!
我遇到问题的例子是:
x<-c(-0.0262, 0.0426, 0.0212, 0.0166, 0.0225
, -0.0089, 0.0418, 0.0246, -0.0128, -0.0841)
y1<-cut(x, breaks=seq(from= -0.15, to=0.1, by=0.05), right=FALSE)
y1 # undesired handling of 0 by using a more generic range in seq
y2<-cut(x, breaks=seq(from= -0.1, to=0.1, by=0.05), right=FALSE)
y2 # desired handling of 0
对于y1:
[1] [-0.05,2.78e-17) [2.78e-17,0.05) [2.78e-17,0.05) [2.78e-17,0.05) [2.78e-17,0.05)
[6] [-0.05,2.78e-17) [2.78e-17,0.05) [2.78e-17,0.05) [-0.05,2.78e-17) [-0.1,-0.05)
Levels: [-0.15,-0.1) [-0.1,-0.05) [-0.05,2.78e-17) [2.78e-17,0.05) [0.05,0.1)
对于y2:
[1] [-0.05,0) [0,0.05) [0,0.05) [0,0.05) [0,0.05) [-0.05,0) [0,0.05)
[8] [0,0.05) [-0.05,0) [-0.1,-0.05)
Levels: [-0.1,-0.05) [-0.05,0) [0,0.05) [0.05,0.1)
答案 0 :(得分:4)
处理浮点数是计算机科学中一个众所周知的混乱问题。由于计算机存储在基数2而不是基数10中的数字,我们在基数10中通常使用的某些数字根本不能在基数10中简洁地表达。我建议使用整数尽可能多地完成工作。例如,这适用于y1
y1<-cut(x, breaks=seq(from= -15, to=10, by=5)/100, right=FALSE)
levels(y1)
#[1] "[-0.15,-0.1)" "[-0.1,-0.05)" "[-0.05,0)" "[0,0.05)" "[0.05,0.1)"