From hankin.robin at gmail.com  Tue Sep 27 22:35:08 2011
From: hankin.robin at gmail.com (robin hankin)
Date: Wed, 28 Sep 2011 09:35:08 +1300
Subject: [Rd] array extraction
Message-ID: <CAHHjBM5eG0tc_D-XpFTroRT+Yv1yHYdL+RgDh+xkH3WpT8MW5w@mail.gmail.com>

hello everyone.

Look at the following R idiom:

 a <- array(1:30,c(3,5,2))
 M <- (matrix(1:15,c(3,5)) %% 4) < 2
 a[M,] <- 0

Now, I think that "a[M,]" has an unambiguous meaning (to a human).
However, the last line doesn't work as desired, but I expected it
to...and it recently took me an indecent amount of time to debug an
analogous case.  Just to be explicit, I would expect a[M,] to extract
a[i,j,] where M[i,j] is TRUE.  (Extract.Rd is perfectly clear here, and R is
behaving as documented).

The best I could cobble together was the following:

 ind <- which(M,arr.ind=TRUE)
 n <- 3
 ind <- cbind(kronecker(ind,rep(1,dim(a)[n])),rep(seq_len(dim(a)[n]),nrow(ind)))
 a[ind] <- 0


but the intent is hardly clear, certainly compared to "a[M,]"

I've been pondering how to implement such indexing, and its
generalization.

Suppose 'a' is a seven-dimensional array, and M1 a matrix and M2 a
three-dimensional array (both Boolean).  Then "a[,M1,,M2]" is a
natural generalization of the above.  I would want a[,M1,,M2] to
extract a[i1,i2,i3,i4,i5,i6,i7] where M1[i2,i3] and M[i5,i6,i7] are
TRUE.

One would need all(dim(a)[2:3] == dim(M1)) and all(dim(a)[5:7] ==
dim(M2)) for consistency.

Can any R-devel subscribers advise?




-- 
Robin Hankin
Uncertainty Analyst
hankin.robin at gmail.com



[Rd] array extraction
robin hankin