[R] Data Manipulation - make diagonal matrix of each element of a matrix
Clemontina Alexander
ckalexa2 at ncsu.edu
Thu Dec 15 16:13:18 CET 2011
I'm sorry, the indices of my X matrix are wrong.
It should be:
X = x11 0 0 x12 0 0
0 x11 0 0 x12 0
0 0 x11 0 0 x12
x21 0 0 x22 0 0
0 x21 0 0 x22 0
0 0 x21 0 0 x22
...
xn1 0 0 x52 0 0
0 xn1 0 0 x52 0
0 0 xn1 0 0 x52
or
X = -0.63 0 0 -0.82 0 0
0 -0.630 0 0 -0.82 0
0 0 -0.630 0 0 -0.82
0.18 0 0 0.49 0 0
0 0.18 0 0 0.49 0
0 0 0.18 0 0 0.49
...
0.33 0 0 -0.31 0 0
0 0.33 0 0 -0.31 0
0 0 0.33 0 0 -0.31
Sorry for the confusion.
Tina
On Thu, Dec 15, 2011 at 10:02 AM, Clemontina Alexander
<ckalexa2 at ncsu.edu> wrote:
> 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
--
Clemontina Alexander
Ph.D Student
Department of Statistics
NC State University
Raleigh, NC 27695
Phone: (850) 322-6878
Email: ckalexa2 at ncsu.com
More information about the R-help
mailing list