Вот попытка объяснить, как apply
может быть полезна здесь, на примере:
printchk <- function(x) {print(x); print(class(x)); cat("------\n")}
tab <- array(1:8,dim=c(2,2,2))
printchk(tab)
#, , 1
#
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
#
#, , 2
#
# [,1] [,2]
#[1,] 5 7
#[2,] 6 8
#
#[1] "array"
#------
Работа с объединенными рядами по слоям
invisible(apply(tab, 1, printchk))
# [,1] [,2]
#[1,] 1 5
#[2,] 3 7
#[1] "matrix"
#------
# [,1] [,2]
#[1,] 2 6
#[2,] 4 8
#[1] "matrix"
#------
Работа с объединенными столбцами по слоям
invisible(apply(tab, 2, printchk))
# [,1] [,2]
#[1,] 1 5
#[2,] 2 6
#[1] "matrix"
#------
# [,1] [,2]
#[1,] 3 7
#[2,] 4 8
#[1] "matrix"
#------
Работа со слоями
invisible(apply(tab, 3, printchk))
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
#[1] "matrix"
#------
# [,1] [,2]
#[1,] 5 7
#[2,] 6 8
#[1] "matrix"
#------
Таким образом, без изменения размеров или структуры, вы можете сравнивать различные части массива, используя вызовы apply
.
oddsratio <- function(x) (x[1,1]/x[2,1]) / (x[1,2]/x[2,2])
apply(tab, 1, oddsratio)
##Expecting: (1/3)/(5/7) = 0.46
## (2/4)/(6/8) = 0.66
#[1] 0.4666667 0.6666667
Да, работает как задумано.
Несколько измерений
Затем можно расширить эту логику, чтобы использовать несколько измерений одновременно, например:
invisible(apply(tab, c(1,2), printchk))
#[1] 1 5
#[1] "integer"
#------
#[1] 2 6
#[1] "integer"
#------
#[1] 3 7
#[1] "integer"
#------
#[1] 4 8
#[1] "integer"
#------