R:将函数应用于列表矩阵的每个元素,并以相同的矩阵格式返回结果

时间:2016-04-09 20:35:49

标签: r list matrix lapply

我们说我有一个列表矩阵:

theList <- matrix(list(rnorm(10), rnorm(10), rnorm(10), rnorm(10)), nrow=2, ncol=2)
theList
     [,1]       [,2]
[1,] Numeric,10 Numeric,10
[2,] Numeric,10 Numeric,10

我想在保留原始尺寸的同时对该矩阵的每个元素应用一些函数。

我发现以下内容适用于sapply:

apply(theList, 2, sapply, mean)
           [,1]      [,2]
[1,]  0.5678905 0.0577225
[2,] -0.2708252 0.5045110

然而,它不适用于lapply:

apply(theList, 2, lapply, mean)
[[1]]
[[1]][[1]]
[1] 0.5678905

[[1]][[2]]
[1] -0.2708252


[[2]]
[[2]][[1]]
[1] 0.0577225

[[2]][[2]]
[1] 0.504511

如何将函数应用于列表矩阵中的每个列表并以相同的格式返回数据 - 具有相同维度的列表矩阵?

3 个答案:

答案 0 :(得分:1)

从向量或列表中重建矩阵并不昂贵,因为它只在对象上设置dim属性。所以我会这样做:

res <- matrix(lapply(theList,mean),nrow(theList));
res;
##      [,1]       [,2]
## [1,] -0.1956084 0.03062223
## [2,] -0.2106935 0.1842444

请注意,虽然上面的结果与双打矩阵完全相同,但它实际上仍然是一个列表矩阵:

str(res);
## List of 4
##  $ : num -0.196
##  $ : num -0.211
##  $ : num 0.0306
##  $ : num 0.184
##  - attr(*, "dim")= int [1:2] 2 2

答案 1 :(得分:1)

这个怎么样,purrr中有很多函数用于像你这样的情况下的映射函数,

library(purrr)
apply(theList, 2, map_dbl, mean)

答案 2 :(得分:0)

似乎来自plyr的这种方法正在发挥作用:

library(plyr)
llply(theList, range)
         [,1]      [,2]
[1,] Numeric,2 Numeric,2
[2,] Numeric,2 Numeric,2