Search code examples
rcutsampling

How to cut data in even pieces in R?


Here is the problem: I have a dataset, let's say:

a <- c(0,0,0,0,1,1,1,1,1,1)

I want to cut it into even pieces (e.g. 5 pieces ). The problem is I cannot use quantiles or cut because some values repeat, so you cannot set distinct breakpoints.

> quantile(a)
  0%  25%  50%  75% 100% 
   0    0    1    1    1 

(repeated breakpoints)

> cut(a, 5)
 [1] (-0.001,0.199] (-0.001,0.199] (-0.001,0.199] (-0.001,0.199] (0.801,1]     
 [6] (0.801,1]      (0.801,1]      (0.801,1]      (0.801,1]      (0.801,1]     
Levels: (-0.001,0.199] (0.199,0.4] (0.4,0.6] (0.6,0.801] (0.801,1]

(only two levels used)

I know I can produce a vector like this:

b <- c(1,1,2,2,3,3,4,4,5,5)

and use it for sampling. Or I can use for loop and count instances. But this needs loops and some clumsy coding. I am looking for a simple and efficient (R-style) function that does better than this.

(I can write it but I don't want to reinvent the wheel.)


Solution

  • You can use cut, but you have to use it on the numerical indices of the vector, i.e., seq(a), not the vector itself.

    Then you split the vector into pieces of equal length with split:

    split(a, cut(seq(a), 5, labels = FALSE))
    

    This returns a list of five short vectors.

    Another way, without cut, is given by

    split(a, rep(seq(5), each = length(a) / 5))