我有一个矩阵列表。我想将所有行(除非最后一行)都转换为零。我尝试了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
我的错误在哪里?有什么想法吗?
答案 0 :(得分:1)
您正在像使用lapply()
循环那样使用for
。 lapply
自己遍历列表,无需使用索引:
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
元素。