Lapply函数不适用于我的矩阵

时间:2018-11-14 07:33:46

标签: r

问题:

我有一个矩阵列表。我想将所有行(除非最后一行)都转换为零。我尝试了lapply函数,但是它没有按预期工作。

示例:

x <- matrix(3,4,4)
y <- matrix(5,4,5)
z <- list(x,y)
NewZ <- lapply(1:2, function(i) z[[i]][-nrow(z[[i]]), ] <- 0)

不幸的是我回来了:

> NewZ
[[1]]
[1] 0

[[2]]
[1] 0

我想要这样的矩阵:

> z[[1]][-nrow(z[[1]]),] <- 0
> z[[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0
[4,]    3    3    3    3
> z[[2]][-nrow(z[[2]]),] <- 0

> z[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    5    5    5    5    5

我的错误在哪里?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您正在像使用lapply()循环那样使用forlapply自己遍历列表,无需使用索引:

NewZ <- lapply(z, function(x){
  x[-nrow(x),] <- 0
  return(x)
})

> NewZ
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0
[4,]    3    3    3    3

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

此外,当您使用lapply更改列表元素的特定部分时(意味着您在调用中使用<-运算符),您需要return元素。