在矩阵列表的每个元素上应用函数

时间:2018-02-13 10:46:05

标签: r list function matrix apply

我有一个矩阵列表。

(下面是一个简化的例子,我实际上有一个3个矩阵的列表,第一个是2D,而第二个和第三个是3D)

> a <- matrix(-1:2, ncol = 2)
> b <- array(c(-2:5), dim=c(2, 2, 2))
> c_list <- list(a,b)
> c_list
[[1]]
     [,1] [,2]
[1,]   -1    1
[2,]    0    2

[[2]]
, , 1

     [,1] [,2]
[1,]   -2    0
[2,]   -1    1

, , 2

     [,1] [,2]
[1,]    2    4
[2,]    3    5

我想将函数max(0,c_list)应用于每个元素(没有循环),以便使用与“c_list”相同类型的对象,但将负值替换为零。

> output
[[1]]
     [,1] [,2]
[1,]    0    1
[2,]    0    2

[[2]]
, , 1

     [,1] [,2]
[1,]    0    0
[2,]    0    1

, , 2

     [,1] [,2]
[1,]    2    4
[2,]    3    5

我已经设法为matrice或mapply或lapply列表,但不是为了矩阵列表。

答案:Sotos的回答

output <- lapply(c_list, function(i)replace(i, i < 0, 0))

或Moody_Mudskipper的回答

output <- lapply(c_list,pmax,0)

2 个答案:

答案 0 :(得分:0)

使用applylapply

a <- matrix(-1:2, ncol = 2)
b <- matrix(-3:0, ncol = 2)
c <- list(a,b)

d <- lapply(c, function(m) {
  apply(m, c(1, 2), function(x) max(0, x))
})

输出:

> d
[[1]]
     [,1] [,2]
[1,]    0    1
[2,]    0    2

[[2]]
     [,1] [,2]
[1,]    0    0
[2,]    0    0

答案 1 :(得分:0)

您可以使用pmax,它将保留源矩阵的格式并进行矢量化,这比使用max循环更快。

lapply(c_list,pmax,0)