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