William -
   An interesting feature of matrix indexing in R is that
if you provide a two column matrix as a subscript, you are
refering to the elements whose indices are in the rows
of the matrix. This is extremely handy for converting tables to matrices:

m = cbind(c(1,1,1,2,2,2,3,3,3),c(1,2,3,1,2,3,1,2,3),c(10,19,8,14,12,6,17,9,2))
m
      [,1] [,2] [,3]
 [1,]    1    1   10
 [2,]    1    2   19
 [3,]    1    3    8
 [4,]    2    1   14
 [5,]    2    2   12
 [6,]    2    3    6
 [7,]    3    1   17
 [8,]    3    2    9
 [9,]    3    3    2
newmat = matrix(0,3,3)
newmat[m[,1:2]] = m[,3]
newmat
     [,1] [,2] [,3]
[1,]   10   19    8
[2,]   14   12    6
[3,]   17    9    2

It's also handy for extracting a vector with just the elements you want:

newmat[cbind(c(1,2,3),c(2,3,1))]
[1] 19  6 17  # 1,2 2,3 3,1 elements

So it's a bit surprising when you index a matrix with a 2 column matrix, but it is a documented fact.

                                        - Phil Spector
                                         Statistical Computing Facility
                                         Department of Statistics
                                         UC Berkeley
                                         spec...@stat.berkeley.edu




On Mon, 5 Apr 2010, William Revelle wrote:

Dear R list,

I have discovered a seemingly peculiar feature when using a matrix to index itself (yes, this is strange code, which I have now modified to be more reasonable).

#this makes sense
s <- matrix(1:3,nrow=1)
s[s]    #all three elements are shown

#but when I try
s <- matrix(1:2,nrow=1)
s[1]     #fine, the first element is shown
s[2]     #fine, the second element is shown
s[s]     #just the second element is shown  -- this is peculiar


#But doing it by columns works for both cases
s <- matrix(1:3,ncol=1)
s[s]    #all three elements are shown


#and when I try the same problem down a column
s <- matrix(1:2,ncol=1)
s[1]     #fine

s[2]     #fine

s[s]     #this shows both elements  as would be expected

#clearly since I have just one dimension, it would have been better to
s <- 1:2
s[s]   #which works as one would expect.

Or, using the array  function we get the same problem.

 s <- array(1:2,dim=c(1,2))
 s[s]
[1] 2
 s <- array(1:2,dim=c(2,1))
 s[s]
[1] 1 2


 sessionInfo()
R version 2.11.0 Under development (unstable) (2010-03-24 r51389)
i386-apple-darwin9.8.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] psych_1.0-87


I think this is unexpected behavior.

Best wishes,

Bill


--
William Revelle         http://personality-project.org/revelle.html
Professor                       http://personality-project.org
Department of Psychology             http://www.wcas.northwestern.edu/psych/
Northwestern University http://www.northwestern.edu/
Use R for psychology                       http://personality-project.org/r
It is 6 minutes to midnight     http://www.thebulletin.org

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to