[R] Data Manipulation - make diagonal matrix of each element of a matrix

Clemontina Alexander ckalexa2 at ncsu.edu
Thu Dec 15 16:02:28 CET 2011


Dear R list,
I have the following data:

set.seed(1)
n  <- 5     # number of subjects
tt <- 3     # number of repeated observation per subject
numco <- 2  # number of covariates
x <- matrix(round(rnorm(n*numco),2), ncol=numco)   # the actual covariates
x
> x
      [,1]  [,2]
[1,] -0.63 -0.82
[2,]  0.18  0.49
[3,] -0.84  0.74
[4,]  1.60  0.58
[5,]  0.33 -0.31

I need to form a matrix X such that
X =      x11      0      0     x21      0      0
              0   x11      0        0   x21      0
              0      0   x11        0      0   x21
           x12      0      0     x22      0      0
              0   x12      0        0   x22      0
              0      0   x12        0      0   x22
                       ...
           x15      0      0     x25      0      0
              0   x15      0        0   x25      0
              0      0   x15        0      0   x25
where both tt and numco can change. (So if tt=5 and numco=4, then X
needs to have 20 columns and n*tt rows. Each diagonal matrix should be
5x5 and there will be 4 of them for the 4 covariates.) I wrote this
funky for loop:

idd <- length(diag(1,tt))    # length of intercept matrix
X <- matrix(numeric(n*numco*idd),ncol=tt*numco)
for(i in 1:numco){
      X[,((i-1)*tt+1):(i*tt)] <- matrix(
        c(matrix(rep(diag(1,tt),n),ncol=tt, byrow=TRUE))   *
rep(rep(x[,i],each=tt),tt)
       , ncol=tt)
}
X

It works fine, but is there an easier way when n, tt, and numco get
larger and larger?
Thanks,
Tina


--
Clemontina Alexander
Ph.D Student
Department of Statistics
NC State University
Email: ckalexa2 at ncsu.com



More information about the R-help mailing list