r - 将列表中的矩阵转换为 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 个矩阵的列表,所以我不想一一进行。
解决方案
我们可以使用原始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)
推荐阅读
- powershell - 根据文件内容运行命令
- vue.js - 如何在 vuetify2 中使用 v-simple-table 构建自动播放滚动表?
- xamarin.forms - 如何在 CarouselView 中向 DataTemplete 添加与列表元素数量一样多的标签?
- reactjs - 如何在 gridjs 单元格中使用 react-router Link 或 history.push
- shell - `tail -F -c +0` 是什么意思?
- excel - 保持工作表的页面方向
- gstreamer - dashsink mpd 段列表给出 404 错误,如何从绝对路径更改为相对路径?
- php - 条带函数一次又一次地调用,令牌反复变化?
- postgresql - 使用存储的名称创建多个模式
- php - Magento 2 提交联系表格未显示成功/错误消息