给出一个矩阵列表:
temp <- list(matrix(c(1,8,3,400), 2),
matrix(c(5,2,300,14),2),
matrix(c(100,200,12,4),2)
)
temp
# [[1]]
# [,1] [,2]
# [1,] 1 3
# [2,] 8 400
#
# [[2]]
# [,1] [,2]
# [1,] 5 300
# [2,] 2 14
#
# [[3]]
# [,1] [,2]
# [1,] 100 12
# [2,] 200 4
我想要矩阵的元素中位数:
[,1] [,2]
[1,] 5 12
[2,] 8 14
这可以在没有明确的for循环的情况下完成吗?
答案 0 :(得分:4)
首先,把它放到一个数组中:
library(abind)
a <- do.call(abind, c(temp, list(along=3)))
然后使用apply
:
apply(a, 1:2, median)
# [,1] [,2]
# [1,] 5 12
# [2,] 8 14
正如@RichardScriven建议的那样,你也可以在没有abind包的情况下构建a
:
a <- array(unlist(temp), c(2, 2, 3))
# or
a <- array(unlist(temp), c(dim(temp[[1]]), length(temp)))
答案 1 :(得分:3)
在tapply
'temp'
unlist
res <- temp[[1]]
res[] <- tapply(unlist(temp), rep(seq(length(temp[[1]])),length(temp)), FUN=median)
res
# [,1] [,2]
#[1,] 5 12
#[2,] 8 14
将“temp”转换为rowMedians
(library(matrixStats)
)后,data.table
的其他选项为setDT(temp)
。
library(data.table)
library(matrixStats)
res[] <- rowMedians(as.matrix(setDT(temp)))