I'm currently trying to neatly cut data with use of the Hmisc
package, as in the example below:
dummy <- data.frame(important_variable=seq(1:1000))
require(Hmisc)
dummy$cuts <- cut2(dummy$important_variable, g = 4)
The produced cuts are correct with respect to the values:
important_variable cuts
1 1 [ 1, 251)
2 2 [ 1, 251)
3 3 [ 1, 251)
4 4 [ 1, 251)
5 5 [ 1, 251)
6 6 [ 1, 251)
> table(dummy$cuts)
[ 1, 251) [251, 501) [501, 751) [751,1000]
250 250 250 250
However, I would like for the data to be presented slightly differently. For instance instead of
[ 1, 251 )
[ 251, 501 )
I would prefer the notation
1 - 250
251 - 500
As I'm doing a lot of that on multiple variables I'm interested in a reproducible solution that would be easy to apply across multiple variables.
Following the discussion in comments, the solution would have to work on more messy variables, like x2 <- runif(100, 5.0, 7.5)
.
We could use gsubfn
to remove the parentheses as well as change the numeric part by subtracting one from the second set of numbers
library(gsubfn)
v1 <- dummy$cuts
v1New <- gsubfn('\\[\\s*(\\d+),\\s*(\\d+)[^0-9]+', ~paste0(x, '-',
as.numeric(y)-1), as.character(v1))
table(v1New)
# 1-250 251-500 501-750 751-999
# 250 250 250 250
For the second case involving decimals, we need to match the numbers along with decimals and capture those groups by placing them in parentheses (([0-9.]+)
, (\\d+\\.\\d+)
). We change the second set of capture group by converting to 'numeric' and subtracting 0.01 from it (as.numeric(y)-0.01
). The \\s*
denotes 0 or more spaces. The spaces was uneven in the format, so we had to use that instead of \\s+
which is 1 or more spaces.
v2New <- gsubfn('\\[\\s*([0-9.]+),(\\d+\\.\\d+).*', ~paste0(x,
'-',as.numeric(y)-0.01), as.character(v2))
table(v2New)
v2New
#5.00-5.59 5.60-6.12 6.13-6.71 6.72-7.49
# 25 25 25 25
set.seed(24)
x2 <- runif(100, 5.0, 7.5)
v2 <- cut2(x2, g=4)