Search code examples
rmatrixrandom-seedpanel-data

Create a matrix with a random number of observations for each group-period


I want to create a matrix for N groups and T time periods. For each combination of T-N, I want to have a random number of lines.

The random number of lines for each N-T is given by round(runif(1,2,4)).

The goal is to have as input :

set.seed(123)
ngroup = 2
tperiod = 2

Using round(runif(1,2,4)) 4 times gives 3,4,3,4, so the output should have :

  • 3 lines for group 1 time 1
  • 4 lines for group 1 time 2
  • 3 lines for group 2 time 1
  • 4 lines for group 2 time 2

And as the output should be :

mat = cbind(c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), c(1,1,1,2,2,2,2,1,1,1,2,2,2,2))
mat
 [,1] [,2]
 [1,]    1    1
 [2,]    1    1
 [3,]    1    1
 [4,]    1    2
 [5,]    1    2
 [6,]    1    2
 [7,]    1    2
 [8,]    2    1
 [9,]    2    1
[10,]    2    1
[11,]    2    2
[12,]    2    2
[13,]    2    2
[14,]    2    2

Where the 1st column is the group ID, and the 2nd the time ID.


Solution

  • Option 1: index the result of expand.grid.

    set.seed(123)
    N <- 1:2
    T <- 1:2
    combos <- length(N)*length(T)
    expand.grid(list(T = T, N = N))[rep.int(1:combos, round(runif(combos, 2, 4))),2:1]
    #>     N T
    #> 1   1 1
    #> 1.1 1 1
    #> 1.2 1 1
    #> 2   1 2
    #> 2.1 1 2
    #> 2.2 1 2
    #> 2.3 1 2
    #> 3   2 1
    #> 3.1 2 1
    #> 3.2 2 1
    #> 4   2 2
    #> 4.1 2 2
    #> 4.2 2 2
    #> 4.3 2 2
    

    Option 2: rep.int(rep(.

    set.seed(123)
    r <- round(runif(length(N)*length(T), 2, 4))
    data.frame(
      N = rep.int(rep(N, each = length(T)), r),
      T = rep.int(rep(T, length(N)), r)
    )
    #>    N T
    #> 1  1 1
    #> 2  1 1
    #> 3  1 1
    #> 4  1 2
    #> 5  1 2
    #> 6  1 2
    #> 7  1 2
    #> 8  2 1
    #> 9  2 1
    #> 10 2 1
    #> 11 2 2
    #> 12 2 2
    #> 13 2 2
    #> 14 2 2