[R] arrayInd and which

David Winsemius dwinsemius at comcast.net
Wed Apr 3 20:04:42 CEST 2013


On Apr 3, 2013, at 10:59 AM, David Winsemius wrote:

> 
> On Apr 3, 2013, at 7:53 AM, Keith S Weintraub wrote:
> 
>> Folks,
>> 
>> I have Googled but not found much regarding arrayInd aside from the "which" help page.
>> 
>> Any good examples or docs on what arrayInd does that is better or different from which()?
>> 
>> In addition take the following 20x10 matrix:
>> 
>> td<-structure(c(1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 
>> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 6, 6, 6, 
>> 6, 6, 1, 6, 6, 6, 6, 6, 6, 3, 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 
>> 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 
>> 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, 6, 2, 
>> 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 5, 6, 6, 6, 6, 5, 6, 
>> 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 
>> 4, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 6, 
>> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 6, 6, 6, 
>> 6, 6, 6, 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6), .Dim = c(20L, 10L
>> ))
>> 
>> I want to find the cells which (hah!) are <= c(rep(5,5), rep(4,5)). That is my bounds are by column.
>> 
>> Is there a better way to do this other than:
>> 
>> bounds<-c(rep(5,5), rep(4,5))
>> idxs<-which(apply(td, 2, "<=", bounds), arr.ind = TRUE)
>> 
>>> idxs
>>     row col
>> [1,]   1   1
>> [2,]  13   1
>> [3,]  13   2
>> [4,]   1   3
>> [5,]   8   3
>> [6,]  13   3
>> [7,]   1   4
>> [8,]  13   4
>> [9,]   1   5
>> [10,]  13   5
>> [11,]   1   6
>> [12,]   4   6
>> [13,]  13   6
>> [14,]   4   7
>> [15,]  13   7
>> [16,]   1   8
>> [17,]   4   8
>> [18,]  13   8
>> [19,]   3   9
>> [20,]   1  10
>> [21,]  13  10
>> 
>> Lastly can you explain these results:
>> 
>>> td[idxs[10,]]
>> [1] 4 6
>> 
>>> td[idxs[10,1]]
>> [1] 4
>> 
>>> td[idxs[10,2]]
>> [1] 6
>> 
>>> td[idxs[10,3]]
>> Error: subscript out of bounds
> 
> This has nothing to do with the behavior of arrayInd and everything to do with the behavior of "[".
> 
>> td[idxs[10,drop=FALSE] ]
> [1] 4

Arrgh. The explanation was correct, but there is a missing comma. Should be:

   td[idxs[10, ,drop=FALSE] ]

Only shows up if you chose a different row

> td [ idxs[12, drop=FALSE] ]
[1] 6  WRONG

> td [ idxs[12, , drop=FALSE] ]
[1] 1  Correct

-- 
David.

> When extracting from a matrix with a result of asingle row the extracted object looses its matrix attributes and becomes a numeric vector. That behavior is prevented with drop=FALSE and desire results accrue.
> 
> This would not have been a puzzle if you had chose multiple rows at a time:
> 
>> td [ idxs[1:2, ] ]
> [1] 1 4
>> td [ idxs ]
> [1] 1 4 1 1 3 3 1 5 3 4 2 1 1 5 3 2 2 4 1 2 3 3
> 
> 

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list