Skip to content

Indexing multi-dimensional table

7 messages · Henrik Bengtsson, David Winsemius, davavra +2 more

#
On Thu, Dec 22, 2011 at 4:34 AM, David A Vavra <davavra at verizon.net> wrote:
if it were integer(0).".
, , c1
     b2 b3
, , c1
     b2 b3

I don't think there is an easy way to achieve:
, , c1
   b2 b3
a1  3  5
a2  4  6

using do.call("[") without explicitly specify the indices for that
"missing" dimension, i.e.
, , c1

   b2 b3
a1  3  5
a2  4  6

If you're willing to use R.utils you can do:

library("R.utils");
b2 b3
a1  3  5
a2  4  6

My $.02

/Henrik
#
On Dec 21, 2011, at 10:34 PM, David A Vavra wrote:

            
Surely that was meant to be:

do.call(`[`, list(tbl, x,NULL,NULL) )

(This does imply you knew the number of dimensions was 3.)
It is interesting to look at what that returns.

tbl <- array(1:27, c(3,3,3))
x=1

str( do.call(`[`, list(tbl, x,NULL,NULL) ) )
  int[1, 0 , 0 ]

It looks as though the Nulls became 0's. So if you wanted to use  
do.call(`[` then this succeeds:

 > do.call(`[`, list(tbl, x, 1:dim(tbl)[2], 1:dim(tbl)[3]) )
      [,1] [,2] [,3]
[1,]    1   10   19
[2,]    4   13   22
[3,]    7   16   25

As does this using the "empty comma" approach:

  eval(parse(text= paste("tbl[ " ,x, " , , ]"))  )
      [,1] [,2] [,3]
[1,]    1   10   19
[2,]    4   13   22
[3,]    7   16   25

(Which after looking at the `r.utils::extract` code suggested by  
Bengtsson,  was what he did ....  after considerably better sanity  
checking than above.)

  
    
#
Yes, at run time.
...
I tried the eval course but that struck me as slower. Perhaps not? It's not
that I'm set on using '['. I was under the impression that was how the eval
expression is eventually parsed. I also thought the empty commas were
eventually passed as NULLs.

Wasn't aware of the 'str' function. Could come in handy down the road.

Thanks.

DAV
#
Yeah, I should have read it better.
...
Thanks, Henrik. I also wasn't aware of R.utils until today. I should do more
reading :)

 DAV


--
View this message in context: http://r.789695.n4.nabble.com/Indexing-multi-dimensional-table-tp4224543p4226198.html
Sent from the R help mailing list archive at Nabble.com.
#
Continuing the annnoying tradition of partial quotes:
   I don't think there is an easy way to achieve: 
    
   > y[,2:3,1,drop=FALSE] 
   , , c1 
      b2 b3 
   a1  3  5 
   a2  4  6 
   
   using do.call("[") without explicitly specify the indices for that 
   "missing" dimension, i.e. 

   > y[seq(length=dim(y)[1]),2:3,1,drop=FALSE] 

You can build the 2nd argument to do.call with alist() instead
of list() to send missing arguments to the function given as
the 1st argument.  E.g. to extract the first row, as a row matrix,
from the matrix state.x77 you usually do
  > state.x77[1, , drop=FALSE]
          Population Income Illiteracy Life Exp Murder HS Grad Frost  Area
  Alabama       3615   3624        2.1    69.05   15.1    41.3    20 50708

and here are some unsucessful attempts to do it with do.call("[",...)
using list()):
  > do.call("[", list(state.x77, 1, ,drop=FALSE)) # bad
  Error in list(state.x77, 1, , drop = FALSE) : argument 3 is empty
  > do.call("[", list(state.x77, 1, drop=FALSE))
  [1] 3615

and a to do it with alist:
  > do.call("[", alist(state.x77, 1, ,drop=FALSE))
          Population Income Illiteracy Life Exp Murder HS Grad Frost  Area
  Alabama       3615   3624        2.1    69.05   15.1    41.3    20 50708

alist() produces a list that you can use c() and subscripting on
to add or modify arguments.  It is usually better to encapsulate
this sort of thing in a function like extract() that has a convenient
interface.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
#
Thanks. alist seems to produce empty list entries for missing arguments. It
wasn't clear to me how to generate one at run time. For example, how does
one append an empty list element? c(x,) produces "argument 2 is empty".
However I've discovered 

	c(alist(x,y),alist(),alist(z))

produces an empty entry between y and z. This will likely fit better in the
code I currently have.
A matter of taste, I guess. Speaking strictly for myself, I am annoyed by
needless repetition (particularly of mostly irrelevant matter such as
output, signature tags, subject name, to/from lines and quotes of quotes of
quotes) not to mention the tedium of such in a long reply stream making it
hard sometimes to locate the relevant replies. Omitting the things I've
listed perforce means a partial quote.

DAV