[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