[R] question on indexing of a matrix
Roger Levy
rog at stanford.edu
Sun Feb 13 18:43:27 CET 2005
Peter Dalgaard <p.dalgaard at biostat.ku.dk> writes:
> Roger Bivand <Roger.Bivand at nhh.no> writes:
>
> > On 12 Feb 2005, Roger Levy wrote:
> >
> > > Hi,
> > >
> > > I have a k-level factor F of length n that I would like to use to
> > > extract from an n-by-k matrix M a vector V such that
> > >
> > > V[i] = M[i,as.numeric(F)[i]]
> > >
> > > I don't currently understand how to do that in R -- can anyone explain
> > > to me how to do so?
> >
> > This may be an answer:
> >
> > > k <- 3
> > > n <- 10
> > > M <- matrix(1:(k*n), ncol=k, nrow=n)
> > > M
> > [,1] [,2] [,3]
> > [1,] 1 11 21
> > [2,] 2 12 22
> > [3,] 3 13 23
> > [4,] 4 14 24
> > [5,] 5 15 25
> > [6,] 6 16 26
> > [7,] 7 17 27
> > [8,] 8 18 28
> > [9,] 9 19 29
> > [10,] 10 20 30
> > > set.seed(1234)
> > > K <- factor(sample(1:3, n, replace=TRUE))
> > > K
> > [1] 1 2 2 2 3 2 1 1 2 2
> > Levels: 1 2 3
> > > Kmm <- model.matrix(terms(~ K-1))
> > > Kmm
> > K1 K2 K3
> > 1 1 0 0
> > 2 0 1 0
> > 3 0 1 0
> > 4 0 1 0
> > 5 0 0 1
> > 6 0 1 0
> > 7 1 0 0
> > 8 1 0 0
> > 9 0 1 0
> > 10 0 1 0
> > attr(,"assign")
> > [1] 1 1 1
> > attr(,"contrasts")
> > attr(,"contrasts")$K
> > [1] "contr.treatment"
> >
> > > rowSums(M * Kmm)
> > 1 2 3 4 5 6 7 8 9 10
> > 1 12 13 14 25 16 7 8 19 20
> >
> > My understanding is that you want to extract the K[i]th column from the
> > [i]th row of M, so the model matrix of K should zero out the values you
> > don't want. Using something like this in a function would mean checking K
> > carefully for the number of levels actually present and their coding.
>
> This looks simpler:
>
> > M[cbind(seq(along=K),as.numeric(K))]
> [1] 1 12 13 14 25 16 7 8 19 20
Thank you! This does the trick.
Best,
Roger
More information about the R-help
mailing list