我有一个矩阵列表。
(下面是一个简化的例子,我实际上有一个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)
答案 0 :(得分:0)
使用apply
和lapply
:
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)