【问题标题】:R: splitting a matrix by its first columnR:将矩阵按其第一列拆分
【发布时间】:2018-07-31 14:23:40
【问题描述】:

我有一个 8 x 3 矩阵,我想将其拆分为一个由 3 个矩阵组成的数组,每个矩阵有 3 列,但行数不同。第一列中的字符串表示应该在哪里进行拆分。

mat
#     [,1] [,2]  [,3] 
#[1,] "a"  "5"   "7"  
#[2,] "a"  "33"  "45" 
#[3,] "b"  "23"  "63" 
#[4,] "b"  "25"  "245"
#[5,] "b"  "78"  "718"
#[6,] "b"  "64"  "94" 
#[7,] "c"  "34"  "56" 
#[8,] "c"  "444" "32"  

【问题讨论】:

    标签: arrays r matrix split


    【解决方案1】:

    如果你确实想要它作为一个数组,你可以使用abind

    splits <- split(seq(nrow(mat)), mat[, 1])
    splits <- lapply(splits, function(x) mat[c(x, rep(NA, max(lengths(splits)) - length(x))),])
    library(abind)
    do.call(abind, list(splits, along = 3))
    
    # , , a
    # 
    #      [,1] [,2] [,3]
    # [1,] "a"  "5"  "7" 
    # [2,] "a"  "33" "45"
    # 
    # , , b
    # 
    #      [,1] [,2] [,3]
    # [1,] "b"  "23" "63"
    # [2,] NA   NA   NA  
    # 
    # , , c
    # 
    #      [,1] [,2]  [,3]
    # [1,] "c"  "34"  "56"
    # [2,] "c"  "444" "32"
    

    【讨论】:

    • 只有我的第一列是由字符串组成的。另一个是经度和纬度数据。你能在你的回答中做这个调整吗?
    【解决方案2】:

    使用split() 分解矩阵,然后使用lapply() 重塑结果段:

    lapply(split(mat, mat[,1]), function(x) matrix(x, ncol=3))
    $a
         [,1] [,2] [,3]
    [1,] "a"  "5"  "7" 
    [2,] "a"  "33" "45"
    
    $b
         [,1] [,2] [,3]
    [1,] "b"  "23" "63"
    
    $c
         [,1] [,2]  [,3]
    [1,] "c"  "34"  "56"
    [2,] "c"  "444" "32"
    

    数据(从 OP 略微截断):

    mat <- matrix(c("a", "5", "7", 
                    "a", "33", "45", 
                    "b", "23", "63", 
                    "c","34", "56", 
                    "c", "444", "32"), 
                  byrow=T, ncol=3)
    mat
         [,1] [,2]  [,3]
    [1,] "a"  "5"   "7" 
    [2,] "a"  "33"  "45"
    [3,] "b"  "23"  "63"
    [4,] "c"  "34"  "56"
    [5,] "c"  "444" "32"
    

    【讨论】:

    • 您好,我需要保留第一列的原始字符串。它们是我的物种名称。
    • 好的,查看更新版本 - 您可以直接在矩阵上应用split
    【解决方案3】:
    lapply(unique(mat[,1,drop=FALSE]), function(x) subset(mat, x == mat[,1,drop=FALSE]))
    

    或者,如果您希望能够使用 mat 第一列的值访问结果:

    res <- sapply(unique(mat[,1,drop=FALSE]), function(x) subset(mat, x == mat[,1,drop=FALSE]))
    res[["a"]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2014-12-25
      • 2016-08-09
      相关资源
      最近更新 更多