【问题标题】:Lapply function does not work for my matricesLapply 函数不适用于我的矩阵
【发布时间】:2018-11-14 07:33:45
【问题描述】:

问题:

我有一个矩阵列表。我想将所有行转换为零,除非最后一行。我尝试了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)

lapply 回复我这个:

> 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

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

【问题讨论】:

    标签: r


    【解决方案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 更改列表元素的特定部分时(意味着您在调用中使用&lt;- 运算符),您需要return 元素。

    【讨论】:

    • 除了这个解决方案之外,您甚至不需要将lapply 的结果值分配给您的列表。您可以使用&lt;&lt;- 赋值,它全局 分配值,而不是在lapply 调用的环境中:x[-nrow(x),] &lt;&lt;- 0。你可以放弃NewZ &lt;- lapply(... assignment。
    • @FloSchmo 然后你会有一个有副作用的函数。 (这与 R 范围方案不一致。)library("fortunes"); fortune(174)burns-stat.com/pages/Tutor/R_inferno.pdf Circle 6
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多