【问题标题】:Create a list out of a matrix从矩阵中创建一个列表
【发布时间】:2020-02-05 10:07:53
【问题描述】:

我遇到了与this question完全相反的问题...

我基本上有一个矩阵,并想从中创建一个列表,这样我每行有一个元素,每个单元格都有一个子元素。

元素的名称应该是行名。

与上面的问题相反,从如下矩阵开始:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5 

我想获取如下列表:

[[1]]
[1] 1 1 2 3 4 5

[[2]]
[1] 2 1 2 3 4 5

[[3]]
[1] 3 1 2 3 4 5

[[4]]
[1] 4 1 2 3 4 5

[[5]]
[1] 5 1 2 3 4 5

[[6]]
[1] 6 1 2 3 4 5

[[7]]
[1] 7 1 2 3 4 5

[[8]]
[1] 8 1 2 3 4 5

[[9]]
[1] 9 1 2 3 4 5

[[10]]
[1] 10  1  2  3  4  5

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    R 的最新版本有一个专门用于此任务的功能(按行或列拆分):

    m <- cbind(1:10, matrix(1:5, nrow = 10, ncol = 5, byrow = TRUE))
    colnames(m) <- paste0("V", 1:6)
    
    asplit(m, 1)
    #[[1]]
    #V1 V2 V3 V4 V5 V6 
    # 1  1  2  3  4  5 
    #
    #[[2]]
    #V1 V2 V3 V4 V5 V6 
    # 2  1  2  3  4  5 
    #
    #...
    

    【讨论】:

    • 谢谢!是asplit 还是split
    • @DaniCee 你可以随时尝试。
    【解决方案2】:

    我们可以根据矩阵的rowsplit

    split(mat, row(mat))
    
    #$`1`
    #[1] 1 1 2 3 4 5
    
    #$`2`
    #[1] 2 1 2 3 4 5
    
    #$`3`
    #[1] 3 1 2 3 4 5
    
    #$`4`
    #[1] 4 1 2 3 4 5
    #...
    

    数据

    mat <- matrix(c(1:10, rep(1:5, each = 10)), ncol = 6)
    

    【讨论】:

    • 是的,就是这样!
    • 如果您不介意的话,还有一个相邻的问题...我如何重命名列表中每个元素的子元素,例如将它们命名为 c('v1','v2','v3','v4','v5','v6')
    • setNames(split(mat, row(mat)), paste0("v", 1:nrow(mat)))
    • @DaniCee ohh..如果您的意思是每个列表中的元素,我想您需要通过lapply(split(mat, row(mat)), function(x) setNames(x, paste0("v", seq_along(x))))再次手动分配它们
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2022-01-08
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多