在R中:使用lapply替换矩阵的对角元素

时间:2013-11-13 20:23:51

标签: r replace lapply diagonal

我想替换列表中包含的矩阵的对角元素。

w <- matrix(rnorm(25), 5)
t <- matrix(seq(1, 25, 1), 5)
s <- list(w, t)

如果我试试这个,那就行了。

diag(s[[1]]) <- rep(0, 5)
diag(s[[2]]) <- rep(0,5)

但如果我尝试这个,我会收到一条错误消息。

lapply(1:2, function(i){diag(s[[i]]) <- rep(0, nrow(s[[i]]))})

所以有两件事是错的。 首先是“lapply-loop”。第二个是nrow(s[[i]])。但为什么。我不 明白这一点。感谢。

2 个答案:

答案 0 :(得分:4)

这应该有效

lapply(s, function(x) { diag(x) <- 0; x})

相当于

lapply(s, function(x) {
  diag(x) <- 0
  return(x)})

请注意,这是有效的,因为匿名函数有一个要返回的对象,它在;后显示或在return(x)中明确指示

答案 1 :(得分:1)

我会使用mapply。当您的对角线依赖于另一个变量时,此方法是合适的。

mapply(FUN = function(i, s) {
  diag(s) <- 0 # zero recycles, see Jilber's answer
  s
}, as.list(1:2), s, SIMPLIFY = FALSE)

[[1]]
          [,1]       [,2]       [,3]       [,4]       [,5]
[1,] 0.0000000 -1.7904313  1.3729230 -2.9166446  0.8452616
[2,] 0.4426715  0.0000000  0.6949080  0.7575147 -0.1733760
[3,] 1.1239462 -0.4743851  0.0000000  0.7562622  0.9003581
[4,] 1.0866904 -0.1133565 -0.1176390  0.0000000 -0.7320746
[5,] 0.4296460 -1.0967132 -0.9295789 -1.9490995  0.0000000

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    6   11   16   21
[2,]    2    0   12   17   22
[3,]    3    8    0   18   23
[4,]    4    9   14    0   24
[5,]    5   10   15   20    0