首页 > 解决方案 > 将列表中的矩阵转换为 R 中的相同维度

问题描述

1)我有一个矩阵列表。

2)我需要列表中的每个矩阵具有相同的行数(特别是 508)。

3)列表中的每个矩阵都有不同的大小。

4) 用 NA 填充所有剩余的行(直到列号)。

设置:

mat1 <- data.frame(matrix(nrow =20, ncol =60, data=rnorm(20*60,0,1)))
mat2 <- data.frame(matrix(nrow =20, ncol =63, data=rnorm(20*63,0,1)))
mat3 <- data.frame(matrix(nrow =23, ncol =66, data=rnorm(23*66,0,1)))

list1 <- c(mat1,mat2,mat3)

所以我需要将 mat1 转换为 508x60 矩阵(第 21-508 行填充有 NA),mat2 需要转换为 508x63 矩阵(第 21-508 行填充有 NA)等。

我的实际数据包含 100 个矩阵的列表,所以我不想一一进行。

标签: rmatrixsize

解决方案


我们可以使用原始NA矩阵创建矩阵rbind

n <- 508
lapply(list1, function(x) rbind(x, matrix(ncol = ncol(x), nrow = n - nrow(x))))

这也是假设所有矩阵的行数都少于n行数。如果可能存在矩阵中的行数超过的情况,n那么我们应该使用nrow = pmax(n - nrow(x), 0).


如果列表是数据框列表(而不是矩阵),这里有几个选项:

使用与矩阵相同的方法,但先换行data.frame,然后rbind

lapply(list1, function(x) rbind(x, 
             data.frame(matrix(ncol = ncol(x), nrow = n - nrow(x)))))

使用数据框,我们还可以直接子集所需的行数。NA对于不存在的行,它将直接给出's。

lapply(list1, function(x) x[seq_len(n), ])

但是,它为值提供了奇怪的行名NA。如果我们想删除行名,我们可以这样做

lapply(list1, function(x) {x <- x[seq_len(n), ];rownames(x) <- NULL;x})

数据

set.seed(123)
mat1 <- matrix(nrow =20, ncol =60, data=rnorm(20*60,0,1))
mat2 <- matrix(nrow =20, ncol =63, data=rnorm(20*63,0,1))
mat3 <- matrix(nrow =23, ncol =66, data=rnorm(23*66,0,1))
list1 <-list(mat1,mat2,mat3)

推荐阅读