在R中逐行将矩阵划分为子矩阵列表

时间:2016-04-17 12:44:00

标签: r matrix split partition

我有一个矩阵,其中每一行都是1或0到1之间的任何数字。我需要将其划分为矩阵列表,以便

  1. 每个子矩阵都是1或所有0到1之间的数字
  2. 使用 rbind 组合列表的所有子矩阵产生原始矩阵
  3. 示例:

    Sample Matrix

    List of sub matrices

    m <- 
    structure(c(1, 1, 1, 0.84, 0.27, 0.24, 0.48, 0.28, 0.62, 0.55, 
    1, 1, 0.26, 0.93, 0.87, 0.76, 1, 1, 1, 1, 1, 0.31, 0.32, 0.96, 
    0.25, 0.96, 0.43, 0.66, 1, 1, 0.22, 0.88, 0.01, 0.14, 1, 1, 1, 
    1, 1, 0.71, 0.99, 0.6, 0.22, 0.73, 0.54, 0.17, 1, 1, 0.59, 0.67, 
    0.07, 0.4, 1, 1, 1, 1, 1, 0.27, 0.62, 0.52, 0.67, 0.69, 0.06, 
    0.63, 1, 1, 0.27, 0.95, 0.16, 0.22, 1, 1, 1, 1, 1, 0.59, 0.94, 
    0.4, 0.05, 0.05, 0.26, 0.31, 1, 1, 0.53, 0.52, 0.77, 0.06, 1, 
    1, 1, 1, 1, 0.48, 0.47, 0.88, 0.7, 0.4, 0.4, 0.72, 1, 1, 0.79, 
    0.58, 0.74, 0.4, 1, 1, 1, 1, 1, 0.27, 0.41, 0.36, 0.35, 0.48, 
    0.2, 0.4, 1, 1, 0.17, 0.34, 0.97, 0.06, 1, 1, 1, 1, 1, 0.56, 
    0.66, 0.29, 0.41, 0.56, 0.83, 0.97, 1, 1, 0.4, 0.35, 0.47, 0.23, 
    1, 1, 1, 1, 1, 0.91, 0.15, 0.17, 0.82, 0.7, 0.15, 0.97, 1, 1, 
    0.47, 0.02, 0.07, 0.05, 1, 1, 1, 1, 1, 0.9, 0.57, 0.17, 0.92, 
    0.92, 0.8, 0.73, 1, 1, 0.87, 0.5, 0.65, 0.67, 1, 1), .Dim = c(18L, 
    10L))
    
    L <- 
    list(structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), .Dim = c(3L, 10L
    )), structure(c(0.84, 0.27, 0.24, 0.48, 0.28, 0.62, 0.55, 0.31, 
    0.32, 0.96, 0.25, 0.96, 0.43, 0.66, 0.71, 0.99, 0.6, 0.22, 0.73, 
    0.54, 0.17, 0.27, 0.62, 0.52, 0.67, 0.69, 0.06, 0.63, 0.59, 0.94, 
    0.4, 0.05, 0.05, 0.26, 0.31, 0.48, 0.47, 0.88, 0.7, 0.4, 0.4, 
    0.72, 0.27, 0.41, 0.36, 0.35, 0.48, 0.2, 0.4, 0.56, 0.66, 0.29, 
    0.41, 0.56, 0.83, 0.97, 0.91, 0.15, 0.17, 0.82, 0.7, 0.15, 0.97, 
    0.9, 0.57, 0.17, 0.92, 0.92, 0.8, 0.73), .Dim = c(7L, 10L)), 
        structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1), .Dim = c(2L, 10L)), structure(c(0.26, 0.93, 
        0.87, 0.76, 0.22, 0.88, 0.01, 0.14, 0.59, 0.67, 0.07, 0.4, 
        0.27, 0.95, 0.16, 0.22, 0.53, 0.52, 0.77, 0.06, 0.79, 0.58, 
        0.74, 0.4, 0.17, 0.34, 0.97, 0.06, 0.4, 0.35, 0.47, 0.23, 
        0.47, 0.02, 0.07, 0.05, 0.87, 0.5, 0.65, 0.67), .Dim = c(4L, 
        10L)), structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1), .Dim = c(2L, 10L)))
    

1 个答案:

答案 0 :(得分:2)

这是一个适合您的解决方案。为方便起见,它使用data.table的rleid。

首先,我们生成一些数据:

set.seed(123)
input <- matrix(runif(180),ncol=10)
input[c(1:3,5,9:10),]<-1

然后我们确定哪些行只有

is_one <- apply(input,1,function(x){all(x==1)})

我们希望按行分割我们的行是一个/不是一个,所以我们生成行ID和分割ID

row_ids <- 1:nrow(input)
split_ids <- data.table::rleid(is_one)

我们生成输出,通过将行的id分割为一个/不是一个,并返回每组行ID的输入数据。

output <- lapply(split(row_ids,split_ids),function(x){input[x,]})