[R] cut{base}: is it a bug?
David L Carlson
dc@r|@on @end|ng |rom t@mu@edu
Mon Sep 24 17:14:09 CEST 2018
You've been bitten by FAQ 7.31: Why doesn't R think these numbers are equal?
https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f
Your boundaries and your data values are not what you think they are. This is a limitation of digital computing not R.
> print(seq(from=.6, to=2.2, by=.2), digits=17)
[1] 0.59999999999999998 0.80000000000000004 1.00000000000000000 1.20000000000000018
[5] 1.39999999999999991 1.60000000000000009 1.80000000000000027 2.00000000000000000
[9] 2.20000000000000018
> print(dat, digits=17)
[1] 0.59999999999999998 0.59999999999999998 0.59999999999999998 0.69999999999999996
[5] 0.69999999999999996 0.69999999999999996 0.69999999999999996 0.69999999999999996
[9] 0.80000000000000004 0.80000000000000004 0.80000000000000004 0.90000000000000002
[13] 0.90000000000000002 0.90000000000000002 0.90000000000000002 1.00000000000000000
[17] 1.00000000000000000 1.00000000000000000 1.00000000000000000 1.10000000000000009
[21] 1.10000000000000009 1.10000000000000009 1.19999999999999996 1.19999999999999996
[25] 1.19999999999999996 1.19999999999999996 1.30000000000000004 1.30000000000000004
[29] 1.30000000000000004 1.39999999999999991 1.39999999999999991 1.39999999999999991
[33] 1.50000000000000000 1.50000000000000000 1.50000000000000000 1.60000000000000009
[37] 1.60000000000000009 1.69999999999999996 1.69999999999999996 1.69999999999999996
[41] 1.69999999999999996 1.80000000000000004 1.80000000000000004 1.80000000000000004
[45] 1.89999999999999991 1.89999999999999991 2.00000000000000000 2.00000000000000000
[49] 2.00000000000000000 2.00000000000000000 2.00000000000000000 2.10000000000000009
The simplest solution is to subtract a bit. This also means you don't need the include.lowest= or right= arguments:
> f <- cut(dat,
+ breaks= seq(from=.6-.01, to=2.2-.01, by=.2),
+ dig.lab=10L)
> as.matrix(tb <- table(f))
[,1]
[0.59,0.79) 8
[0.79,0.99) 7
[0.99,1.19) 7
[1.19,1.39) 7
[1.39,1.59) 6
[1.59,1.79) 6
[1.79,1.99) 5
[1.99,2.19] 6
----------------------------------------
David L Carlson
Department of Anthropology
Texas A&M University
College Station, TX 77843-4352
-----Original Message-----
From: R-help <r-help-bounces using r-project.org> On Behalf Of Jose Claudio Faria
Sent: Monday, September 24, 2018 9:32 AM
To: r-help using r-project.org
Subject: [R] cut{base}: is it a bug?
Dears members,
Is the below a bug of the cut {base} function?
dat <- c(
0.6, 0.6, 0.6, 0.7, 0.7, 0.7, 0.7, 0.7, #(8)
0.8, 0.8, 0.8, 0.9, 0.9, 0.9, 0.9, #(7)
1.0, 1.0, 1.0, 1.0, 1.1, 1.1, 1.1, #(7)
1.2, 1.2, 1.2, 1.2, 1.3, 1.3, 1.3, #(7)
1.4, 1.4, 1.4, 1.5, 1.5, 1.5, #(6)
1.6, 1.6, 1.7, 1.7, 1.7, 1.7, #(6)
1.8, 1.8, 1.8, 1.9, 1.9, #(5)
2.0, 2.0, 2.0, 2.0, 2.0, 2.1 #(6)
)
# making class from function "cut"
(f <- cut(dat,
breaks= seq(from=.6, to=2.2, by=.2),
include.lowest=TRUE,
dig.lab=10L,
right=FALSE))
# more easy to see the table
as.matrix(tb <- table(f))
# Checking
print(length(dat[dat >= 0.6 & dat < 0.8])) == tb[1] print(length(dat[dat >= 0.8 & dat < 1.0])) == tb[2] print(length(dat[dat >= 1.0 & dat < 1.2])) == tb[3] # !?
print(length(dat[dat >= 1.2 & dat < 1.4])) == tb[4] # !?
print(length(dat[dat >= 1.4 & dat < 1.6])) == tb[5] print(length(dat[dat >= 1.6 & dat < 1.8])) == tb[6] # !?
print(length(dat[dat >= 1.8 & dat < 2.0])) == tb[7] # !?
print(length(dat[dat >= 2.0 & dat < 2.2])) == tb[8]
Best,
///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
Jose Claudio Faria
UESC/DCET/Brasil
joseclaudio.faria at gmail.com
Telefones:
55(73)3680.5545 - UESC
55(73)99966.9100 - VIVO
55(73)98817.6159 - OI
///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
If you have software to deal with statistics, you have arms; if you have good software, you have arms and legs; if you have software like R, you have arms, legs and wings...
the height of your flight depends only on you!
[[alternative HTML version deleted]]
______________________________________________
R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list