Subsetting an NaArray object
NaArray-subsetting.Rd
EXPERIMENTAL!!!
Like ordinary arrays in base R, NaArray objects support
subsetting via the single bracket operator ([
).
See also
drop
in base R to drop the ineffective dimensions of an array or array-like object.Lindex2Mindex
in the S4Arrays package for how to convert an L-index to an M-index and vice-versa.NaArray objects.
Examples
naa <- NaArray(dim=5:3)
naa[c(1:2, 8, 10, 15:17, 20, 24, 40, 56:60)] <- (1:15)*10L
## ---------------------------------------------------------------------
## N-dimensional subsetting
## ---------------------------------------------------------------------
naa[5:3, c(4,2,4), 2:3]
#> <3 x 3 x 2 NaArray> of type "integer" [nnacount=8 (44%)]:
#> ,,1
#> [,1] [,2] [,3]
#> [1,] 100 NA 100
#> [2,] NA NA NA
#> [3,] NA NA NA
#>
#> ,,2
#> [,1] [,2] [,3]
#> [1,] 150 NA 150
#> [2,] 140 NA 140
#> [3,] 130 NA 130
#>
naa[ , c(4,2,4), 2:3]
#> <5 x 3 x 2 NaArray> of type "integer" [nnacount=12 (40%)]:
#> ,,1
#> [,1] [,2] [,3]
#> [1,] NA NA NA
#> [2,] NA NA NA
#> [3,] NA NA NA
#> [4,] NA NA NA
#> [5,] 100 NA 100
#>
#> ,,2
#> [,1] [,2] [,3]
#> [1,] 110 NA 110
#> [2,] 120 NA 120
#> [3,] 130 NA 130
#> [4,] 140 NA 140
#> [5,] 150 NA 150
#>
naa[ , c(4,2,4), -1]
#> <5 x 3 x 2 NaArray> of type "integer" [nnacount=12 (40%)]:
#> ,,1
#> [,1] [,2] [,3]
#> [1,] NA NA NA
#> [2,] NA NA NA
#> [3,] NA NA NA
#> [4,] NA NA NA
#> [5,] 100 NA 100
#>
#> ,,2
#> [,1] [,2] [,3]
#> [1,] 110 NA 110
#> [2,] 120 NA 120
#> [3,] 130 NA 130
#> [4,] 140 NA 140
#> [5,] 150 NA 150
#>
naa[ , c(4,2,4), 1]
#> <5 x 3 NaMatrix> of type "integer" [nnacount=8 (53%)]:
#> [,1] [,2] [,3]
#> [1,] 60 NA 60
#> [2,] 70 NA 70
#> [3,] NA 30 NA
#> [4,] NA NA NA
#> [5,] 80 40 80
naa2 <- naa[ , c(4,2,4), 1, drop=FALSE]
naa2
#> <5 x 3 x 1 NaArray> of type "integer" [nnacount=8 (53%)]:
#> ,,1
#> [,1] [,2] [,3]
#> [1,] 60 NA 60
#> [2,] 70 NA 70
#> [3,] NA 30 NA
#> [4,] NA NA NA
#> [5,] 80 40 80
#>
## Ineffective dimensions can always be dropped as a separate step:
drop(naa2)
#> <5 x 3 NaMatrix> of type "integer" [nnacount=8 (53%)]:
#> [,1] [,2] [,3]
#> [1,] 60 NA 60
#> [2,] 70 NA 70
#> [3,] NA 30 NA
#> [4,] NA NA NA
#> [5,] 80 40 80
naa[ , c(4,2,4), integer(0)]
#> <5 x 3 x 0 NaArray> of type "integer" [nnacount=0 (NaN%)]
dimnames(naa) <- list(letters[1:5], NULL, LETTERS[1:3])
naa[c("d", "a"), c(4,2,4), "C"]
#> <2 x 3 NaMatrix> of type "integer" [nnacount=4 (67%)]:
#> [,1] [,2] [,3]
#> d 140 NA 140
#> a 110 NA 110
naa2 <- naa["e", c(4,2,4), , drop=FALSE]
naa2
#> <1 x 3 x 3 NaArray> of type "integer" [nnacount=7 (78%)]:
#> ,,A
#> [,1] [,2] [,3]
#> e 80 40 80
#>
#> ,,B
#> [,1] [,2] [,3]
#> e 100 NA 100
#>
#> ,,C
#> [,1] [,2] [,3]
#> e 150 NA 150
#>
drop(naa2)
#> <3 x 3 NaMatrix> of type "integer" [nnacount=7 (78%)]:
#> A B C
#> [1,] 80 100 150
#> [2,] 40 NA NA
#> [3,] 80 100 150
## ---------------------------------------------------------------------
## 1D-style subsetting (a.k.a. linear subsetting)
## ---------------------------------------------------------------------
## Using a numeric vector (L-index):
naa[c(60, 24, 21, 56)]
#> [1] 150 90 NA 110
## Using a matrix subscript (M-index):
m <- rbind(c(5, 4, 3),
c(4, 1, 2),
c(1, 1, 2),
c(1, 4, 3))
naa[m]
#> [1] 150 90 NA 110
## See '?Lindex2Mindex' in the S4Arrays package for how to convert an
## L-index to an M-index and vice-versa.
## ---------------------------------------------------------------------
## Sanity checks
## ---------------------------------------------------------------------
a <- as.array(naa)
naa2 <- naa[5:3, c(4,2,4), 2:3]
a2 <- a [5:3, c(4,2,4), 2:3]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa[ , c(4,2,4), 2:3]
a2 <- a [ , c(4,2,4), 2:3]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa[ , c(4,2,4), -1]
a2 <- a [ , c(4,2,4), -1]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa[ , c(4,2,4), 1]
a2 <- a [ , c(4,2,4), 1]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa[ , c(4,2,4), 1, drop=FALSE]
a2 <- a [ , c(4,2,4), 1, drop=FALSE]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- drop(naa2)
a2 <- drop(a2)
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa[ , c(4,2,4), integer(0)]
a2 <- a [ , c(4,2,4), integer(0)]
stopifnot(identical(as.array(naa2), a2),
identical(unname(naa2), unname(NaArray(a2))))
naa2 <- naa[c("d", "a"), c(4,2,4), "C"]
a2 <- a [c("d", "a"), c(4,2,4), "C"]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- naa["e", c(4,2,4), , drop=FALSE]
a2 <- a ["e", c(4,2,4), , drop=FALSE]
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
naa2 <- drop(naa2)
a2 <- drop(a2)
stopifnot(identical(as.array(naa2), a2), identical(naa2, NaArray(a2)))
stopifnot(identical(naa[c(60, 24, 21, 56)], naa[m]))