[R] arrayInd and which

David Winsemius dwinsemius at comcast.net
Wed Apr 3 19:59:17 CEST 2013


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

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