首页 > 解决方案 > 根据标准创建子集矩阵/根据标准提取关键行

问题描述

我想将原始矩阵的行子集为两个单独的矩阵。我将问题设置如下:

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 行 +

标签: rmatrixsubsetextract

解决方案


您可以使用sapplywhich 迭代Mat1withseq_along(Mat1)和 subset Mat1using的列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))

推荐阅读