根据非 NA 列组合集合中的矩阵

Combining matrices in set according to non-NA columns

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

集合中的每个矩阵都有不同的行数。当我们组合矩阵时,新行应该用 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 列,然后加入前 3 个非 NA 列。此外,如果它可以在大量矩阵/ data.frames 上工作,那就太好了。谢谢!

输出应为以下形式:

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

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

我们可以使用 lapply 遍历矩阵列表和 select 具有非 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))