r - 根据标准创建子集矩阵/根据标准提取关键行
问题描述
我想将原始矩阵的行子集为两个单独的矩阵。我将问题设置如下:
set.seed(2)
Mat1 <- data.frame(matrix(nrow = 4, ncol =10, data = rnorm(40,0,1)))
keep.rows = matrix(nrow =2, ncol =4)
keep.rows[,1] = c(1,2)
keep.rows[,2] = c(2,3)
keep.rows[,3] = c(2,3)
keep.rows[,4] = c(1,2)
Mat1
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 0.9959846 -2.2079198 -0.3869496 -1.183606 1.959357077 1.0744594 -0.8621983 -0.4213736 0.4718595 1.2309537
2 -1.6957649 1.8221225 0.3866950 -1.358457 0.007645872 0.2605978 2.0480403 -0.3508344 1.3589398 1.1471368
3 -0.5333721 -0.6533934 1.6003909 -1.512671 -0.842615198 -0.3142720 0.9399201 -1.0273806 0.5641686 0.1065980
4 -1.3722695 -0.2846812 1.6811550 -1.253105 -0.601160105 -0.7496301 2.0086871 -0.2505191 0.4559801 -0.7833167
Mat 1 是我的原始矩阵。现在从 Keep rows 矩阵,我想创建两个输出矩阵。第一个输出矩阵 (Output1) 应存储 keep.row 中指定的所有行号。第二个输出(Output2)矩阵应该存储所有剩余的行。在我的实际应用程序中,我的矩阵非常大,因此不能像我在这里那样手动排序。
我需要: 1)我需要一个简单地在大型矩阵上执行此操作的函数。2)理想情况下,我可以每次将条目数更改为“保留”。所以在这种情况下,我存储 3 个条目。但是,想象一下如果我的 keep.rows 矩阵是 2x2。在这种情况下,我可能希望每次存储五个条目。
结果应采用以下形式:
Output1 <- data.frame(matrix(nrow = 2, ncol =10))
Output1[1:2,1:3] <- Mat1[c(1,2), 1:3]
Output1[1:2,4:6] <- Mat1[c(2,3), 4:6]
Output1[1:2,7:9] <- Mat1[c(2,3), 7:9]
Output1[1:2,10] <- Mat1[c(1,2), 10]
Output2 <- data.frame(matrix(nrow = 2, ncol =10))
Output2[1:2,1:3] <- Mat1[c(3,4), 1:3]
Output2[1:2,4:6] <- Mat1[c(1,4), 4:6]
Output2[1:2,7:9] <- Mat1[c(1,4), 7:9]
Output2[1:2,10] <- Mat1[c(3,4), 10]
重要提示:在答案中,我需要以保留所有剩余行的方式指定输出 2。在我的应用程序中,我的 keep.row 矩阵大小相同。但是 Mat1 包含 1000 行 +
解决方案
您可以使用sapply
which 迭代Mat1
withseq_along(Mat1)
和 subset Mat1
using的列keep.rows
。随着cbind
您从返回的 sapply 列表中获得类似矩阵的 data.frame。要获取剩余数据,您只需放置一个-
before keep.rows
。
Output1 <- do.call(cbind, sapply(seq_along(Mat1), function(i) Mat1[keep.rows[,(i+2) %/% 3], i, drop = FALSE], simplify = FALSE))
Output2 <- do.call(cbind, sapply(seq_along(Mat1), function(i) Mat1[-keep.rows[,(i+2) %/% 3], i, drop = FALSE], simplify = FALSE))
推荐阅读
- python - 在 jupyter-notebook 中为 50000 左右的数据点绘制群图是否可行?
- javascript - S3 存储桶无法通过路由加载 React 应用程序
- php - 如何使用 mews/Purifier 添加 HTML 5 标签,如(视频和源)?
- c# - 在 sql 代码上出现语法错误并且无法找出原因
- c++ - 如何确定所有变量的内存占用
- tensorflow - 如何在使用 conda 安装 tensorflow 时修复“没有空间留给此设备”错误?
- vue.js - 如何初始化生成的标记?
- google-apps-script - 谷歌应用脚本,如何在另一个具有 ID 的文件中创建触发器?
- c++ - 查找其数字平方和为素数的数(Pascal 或 C++)
- c++builder - 为什么 #pragma 消息在 hpp 文件中不起作用?