2

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.

yacx
  • 167
  • 2
  • 13

2 Answers2

2

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
jblood94
  • 10,340
  • 1
  • 10
  • 15
1

I think rep should be sufficient to make it, i.e.,

set.seed(123)
Ngrp <- 1:2
Tgrp <- 1:2

p <- round(runif(length(Ngrp) * length(Tgrp), 2, 4))

data.frame(
    N = rep(rep(Ngrp, each = length(Tgrp)), p),
    T = rep(rep(Tgrp, length.out = length(p)), p)
)

which gives

   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
ThomasIsCoding
  • 96,636
  • 9
  • 24
  • 81