【问题标题】:Combining matrices in set according to non-NA columns根据非 NA 列组合集合中的矩阵
【发布时间】:2019-12-05 21:09:01
【问题描述】:

我们从一组矩阵开始。参考集合中的所有矩阵,我想创建一个新矩阵,它表示集合中每个矩阵的列的组合。

集合中的每个矩阵都有不同的行数。当我们组合矩阵时,新行应该用 NA 填充。新矩阵采用集合中每个矩阵的前 3 个非 NA 列并将它们连接起来。

设置

set.seed(4)
mat1 <- matrix(nrow =9, ncol=9, runif(81))
mat2 <- matrix(nrow=10, ncol =9, runif(90))
mat3 <- matrix(nrow=11, ncol =9, runif(99))
mat4 <- matrix(nrow =9, ncol=9, runif(81)) 
mat2[,1:3] <- NA
mat3[,1:5] <- NA
mat4[,1:4] <- NA
mat_set <- list(mat1,mat2,mat3, mat4)

新矩阵:

绑定:

mat1[,1:3], mat2[,6:9], mat3[,6:9], mat4[,5:8]

我希望新矩阵具有与集合中最大矩阵相同的行数(在本例中 nrow =11)。当集合中的矩阵行不等于 11 时,用 NA 填充它们的条目。因此,对于 Mat1,使目前不存在的第 10 行和第 11 行对所有列都等于 NA。此步骤必须在将矩阵绑定在一起之前进行。

输出形式: 理想情况下,我希望代码自动检测集合中矩阵的 NA 列,然后加入 FIRST 3 Non-NA 列。此外,如果它可以在大量矩阵/数据帧上工作,那就太好了。谢谢!

输出的形式应该是:

cbind.fill(mat1[,1:3], mat2[,7:9], mat3[,7:9], mat4[,7:9], fill= NA)

但不必手动输入集合中的每个矩阵。

【问题讨论】:

    标签: r list matrix bind


    【解决方案1】:

    我们可以使用lapply 循环矩阵列表并选择具有非NA 值的前3 列,然后使用do.callcbind.fill 应用于列表。

    do.call(rowr::cbind.fill, c(lapply(mat_set, function(x) 
            x[, head(which(apply(!is.na(x), 2, any)), 3)]), fill = NA))
    

    或者使用colSums获取非NA列的另一种方法

    do.call(rowr::cbind.fill, c(lapply(mat_set, function(x) 
         x[, head(which(colSums(is.na(x)) != nrow(x)), 3)]), fill = NA))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 2016-03-11
      • 2017-05-03
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多