How to subset from a 4 dimensional array in R, based on value -
basically have 4 dimensional array of various radar variables named pol has dim (5,1191,360,11)
for part of analysis want subset analysis pixels below height, note pol[2,,,] contains height information ideally this
newpol<-pol[pol[2,,,]<5,]
the issue construct not 4 dimensional features, have tried
newpol[,,,]<-pol[,,,][pol[2,,,]<5,,,]
but results in error "logical subscript long"
my goal obtain 4 dimensional array consisting of elements of pol pol[2,,,]<5.
thanks in advance assistance.
two things here: adding ,drop=false
indexing, , which(..., arr.ind=true)
.
some data:
set.seed(42) pol <- array(sample(20, size=3*4*5*6, replace=true), dim=c(3,4,5,6))
this simple subsetting, lose dimensionality c(3,4,5,6)
c(4,5,6)
, not good:
pol[2,,,] < 5 ## , , 1 ## [,1] [,2] [,3] [,4] [,5] ## [1,] false false false false false ## [2,] false false false false false ## [3,] true false false false false ## [4,] false false true false false ## , , 2 ## ...snip...
to fix this, use drop=false
:
pol[2,,,,drop=false] < 5 ## , , 1, 1 ## [,1] [,2] [,3] [,4] ## [1,] false false true false ## , , 2, 1 ## [,1] [,2] [,3] [,4] ## [1,] false false false false ## , , 3, 1 ## ...snip...
a nice trick indices of of "successes" using:
head(which(pol[2,,,,drop=false] < 5, arr.ind=true)) ## dim1 dim2 dim3 dim4 ## [1,] 1 3 1 1 ## [2,] 1 4 3 1 ## [3,] 1 4 1 2 ## [4,] 1 2 2 2 ## [5,] 1 3 2 2 ## [6,] 1 2 3 2
to can individual values:
pol[ which(pol[2,,,,drop=false] < 5, arr.ind=true) ] ## [1] 15 14 5 15 11 2 14 11 4 13 3 9 6 3 4 16 11 7 7 13 8 7 10 8 19 ## [26] 12
hope helps.
Comments
Post a Comment