【问题标题】:Copy a value within a matrix to another position in r将矩阵中的值复制到 r 中的另一个位置
【发布时间】:2019-08-20 19:29:50
【问题描述】:

我有一个所有不同维度的矩阵列表。我想取一个存在于最后一行、倒数第二列的值,并将该值复制到矩阵的右下角。

矩阵列表如下所示:

> matrix.list

$`1`
      [,1] [,2] [,3] [,4]      [,5] [,6]     [,7]      [,8] [,9]
 [1,]    0    0    0    0 0.0000000    0 0.000000 0.0000000 4.52
 [2,]    1    0    0    0 0.0000000    0 0.000000 0.0000000 0.00
 [3,]    0    1    0    0 0.0000000    0 0.000000 0.0000000 0.00
 [4,]    0    0    1    0 0.0000000    0 0.000000 0.0000000 0.00
 [5,]    0    0    0    1 0.0000000    0 0.000000 0.0000000 0.00
 [6,]    0    0    0    0 0.9733333    0 0.000000 0.0000000 0.00
 [7,]    0    0    0    0 0.0000000    1 0.000000 0.0000000 0.00
 [8,]    0    0    0    0 0.0000000    0 0.902029 0.0000000 0.00
 [9,]    0    0    0    0 0.0000000    0 0.000000 0.9733333 0.00

$`2`
     [,1] [,2] [,3] [,4] [,5] [,6]  [,7] [,8]
[1,]    0    0    0    0 0.00    0 0.000  6.5
[2,]    1    0    0    0 0.00    0 0.000  0.0
[3,]    0    1    0    0 0.00    0 0.000  0.0
[4,]    0    0    1    0 0.00    0 0.000  0.0
[5,]    0    0    0    1 0.00    0 0.000  0.0
[6,]    0    0    0    0 0.96    0 0.000  0.0
[7,]    0    0    0    0 0.00    1 0.000  0.0
[8,]    0    0    0    0 0.00    0 0.905  0.0

$`3`
     [,1] [,2] [,3] [,4]      [,5] [,6] [,7]
[1,]    0    0    0    0 0.0000000    0 4.82
[2,]    1    0    0    0 0.0000000    0 0.00
[3,]    0    1    0    0 0.0000000    0 0.00
[4,]    0    0    1    0 0.0000000    0 0.00
[5,]    0    0    0    1 0.0000000    0 0.00
[6,]    0    0    0    0 0.9866667    0 0.00
[7,]    0    0    0    0 0.0000000    1 0.00

我想把它改成这样:

> matrix.list

$`1`
      [,1] [,2] [,3] [,4]      [,5] [,6]     [,7]      [,8]      [,9]
 [1,]    0    0    0    0 0.0000000    0 0.000000 0.0000000 4.5200000
 [2,]    1    0    0    0 0.0000000    0 0.000000 0.0000000 0.0000000
 [3,]    0    1    0    0 0.0000000    0 0.000000 0.0000000 0.0000000
 [4,]    0    0    1    0 0.0000000    0 0.000000 0.0000000 0.0000000
 [5,]    0    0    0    1 0.0000000    0 0.000000 0.0000000 0.0000000
 [6,]    0    0    0    0 0.9733333    0 0.000000 0.0000000 0.0000000
 [7,]    0    0    0    0 0.0000000    1 0.000000 0.0000000 0.0000000
 [8,]    0    0    0    0 0.0000000    0 0.902029 0.0000000 0.0000000
 [9,]    0    0    0    0 0.0000000    0 0.000000 0.9733333 0.9733333

$`2`
     [,1] [,2] [,3] [,4] [,5] [,6]  [,7]   [,8]
[1,]    0    0    0    0 0.00    0 0.000  6.500
[2,]    1    0    0    0 0.00    0 0.000  0.000
[3,]    0    1    0    0 0.00    0 0.000  0.000
[4,]    0    0    1    0 0.00    0 0.000  0.000
[5,]    0    0    0    1 0.00    0 0.000  0.000
[6,]    0    0    0    0 0.96    0 0.000  0.000
[7,]    0    0    0    0 0.00    1 0.000  0.000
[8,]    0    0    0    0 0.00    0 0.905  0.905

$`3`
     [,1] [,2] [,3] [,4]      [,5] [,6] [,7]
[1,]    0    0    0    0 0.0000000    0 4.82
[2,]    1    0    0    0 0.0000000    0 0.00
[3,]    0    1    0    0 0.0000000    0 0.00
[4,]    0    0    1    0 0.0000000    0 0.00
[5,]    0    0    0    1 0.0000000    0 0.00
[6,]    0    0    0    0 0.9866667    0 0.00
[7,]    0    0    0    0 0.0000000    1 1.00

我尝试在感兴趣的位置提取值:

data.list2 <- lapply(data.list, function(x) x[nrow(x),ncol(x)-1])

但我收到许多人遇到的关于尺寸不正确的错误:

Error in x[nrow(x), ncol(x) - 1] : incorrect number of dimensions

有没有办法索引某个位置,然后将其复制到矩阵列表中的相同位置?类似于dplyr::nth 命令但用于矩阵?

【问题讨论】:

    标签: r list matrix dplyr


    【解决方案1】:

    您明白了,但没有分配/返回新矩阵。 这应该可以完成工作

    # for the sake of reproducibility
    set.seed(123)
    
    # create a reproducible example
    matrix.list <- list(
      matrix(runif(12), 4, 3),
      matrix(runif(24), 6, 4)
    )
    
    # our original matrix
    matrix.list
    
    
    [[1]]
    [,1]      [,2]      [,3]
    [1,] 0.2875775 0.9404673 0.5514350
    [2,] 0.7883051 0.0455565 0.4566147
    [3,] 0.4089769 0.5281055 0.9568333
    [4,] 0.8830174 0.8924190 0.4533342
    
    [[2]]
    [,1]      [,2]      [,3]       [,4]
    [1,] 0.67757064 0.3279207 0.6557058 0.96302423
    [2,] 0.57263340 0.9545036 0.7085305 0.90229905
    [3,] 0.10292468 0.8895393 0.5440660 0.69070528
    [4,] 0.89982497 0.6928034 0.5941420 0.79546742
    [5,] 0.24608773 0.6405068 0.2891597 0.02461368
    [6,] 0.04205953 0.9942698 0.1471136 0.47779597
    
    lapply(matrix.list, function(x) {
      x[nrow(x), ncol(x)] <- x[nrow(x), ncol(x)-1] # we assign
      x                                            # and return
      }
    )
    
    [[1]]
    [,1]      [,2]      [,3]
    [1,] 0.2875775 0.9404673 0.5514350
    [2,] 0.7883051 0.0455565 0.4566147
    [3,] 0.4089769 0.5281055 0.9568333
    [4,] 0.8830174 0.8924190 0.8924190
    
    [[2]]
    [,1]      [,2]      [,3]       [,4]
    [1,] 0.67757064 0.3279207 0.6557058 0.96302423
    [2,] 0.57263340 0.9545036 0.7085305 0.90229905
    [3,] 0.10292468 0.8895393 0.5440660 0.69070528
    [4,] 0.89982497 0.6928034 0.5941420 0.79546742
    [5,] 0.24608773 0.6405068 0.2891597 0.02461368
    [6,] 0.04205953 0.9942698 0.1471136 0.14711365
    

    这就是你要找的吗?

    【讨论】:

    • 这似乎是攻击它的正确方法,但我收到相同的错误消息。我试图将它强制转换为矩阵:matrix.list &lt;- lapply(matrix.list, function(x) as.matrix(x)) 但现在我收到错误:Error in x[nrow(x), ncol(x)] &lt;- x[nrow(x), ncol(x) - 1] : replacement has length zero 有什么想法吗?
    • 你能检查哪一列失败了吗?
    【解决方案2】:

    加点purrr包:

    require(purrr)
    
    map(matrix.list, function(x) {
    x[nrow(x), ncol(x)] <- x[nrow(x), ncol(x) - 1] 
    x
    })
    

    关于错误,可能是某些矩阵只有一列吗?

    【讨论】:

    • 但在这种情况下,“倒数第二列”语句不正确?
    • 其中一个矩阵确实只有一列。感谢您建议@Hong
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多