【问题标题】:Make a list of 2x2 matrices from a list of vectors从向量列表中创建一个 2x2 矩阵列表
【发布时间】:2022-01-08 11:44:47
【问题描述】:

我想从这个列表中列出四个 2x2 矩阵

str(SC_sum)    
List of 4
 $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227
  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
 $ : Named num [1:4] 0.408 0.705 0.401 0.4
  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
 $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757
  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
 $ : Named num [1:4] 0.924 0.848 0.897 0.454
  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"

lapply(SC_sum, "matrix", nrow = 2, byrow = T)

我希望我的chisel 矩阵是matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F),这是SC_sum 中四个向量中每个向量中的第一个元素,然后disc 矩阵是@ 中每个向量中第二个元素的组合987654327@等。

我当前的chisel 矩阵是matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F),这是第一个向量的重新排列。如何更改我的代码?非常感谢!

【问题讨论】:

    标签: r matrix lapply


    【解决方案1】:

    这个怎么样?在这里,x 正在取代您的 SC_sum

    x <- split(seq_len(16), gl(4, 4))
    x <- lapply(x, `names<-`, letters[1:4])
    x
    
    $`1`
    a b c d 
    1 2 3 4 
    
    $`2`
    a b c d 
    5 6 7 8 
    
    $`3`
     a  b  c  d 
     9 10 11 12 
    
    $`4`
     a  b  c  d 
    13 14 15 16 
    
    m <- matrix(unlist(x), nrow = length(x[[1]]), ncol = length(x), 
                dimnames = list(names(x[[1]]), NULL))
    m
    
      [,1] [,2] [,3] [,4]
    a    1    5    9   13
    b    2    6   10   14
    c    3    7   11   15
    d    4    8   12   16
    
    l <- apply(m, 1, matrix, ncol = 2, simplify = FALSE)
    l
    
    $a
         [,1] [,2]
    [1,]    1    9
    [2,]    5   13
    
    $b
         [,1] [,2]
    [1,]    2   10
    [2,]    6   14
    
    $c
         [,1] [,2]
    [1,]    3   11
    [2,]    7   15
    
    $d
         [,1] [,2]
    [1,]    4   12
    [2,]    8   16
    

    如果你真的想使用lapply 而不是apply,那么你可以这样做:

    index <- seq_along(x[[1]])
    names(index) <- names(x[[1]])
    l <- lapply(index, function(i) matrix(vapply(x, `[[`, 0, i), ncol = 2))
    

    但是由于您的数据基本上是矩形的,因此(我认为)构造和操作矩阵要直观得多。

    【讨论】:

    • 非常感谢。 vapply 提示对我很有效。
    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2017-07-14
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多