根据条件创建子集矩阵/根据条件提取键行

时间:2019-09-12 14:08:05

标签: r matrix subset extract

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

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

垫1是我的原始矩阵。现在,从“保留行”矩阵中,我想创建两个输出矩阵。第一个输出矩阵(Output1)应该存储keep.row中指定的所有行号。第二个output(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行+

1 个答案:

答案 0 :(得分:1)

您可以使用sapply来对Mat1的{​​{1}}列和使用seq_along(Mat1)的子集Mat1进行迭代。使用keep.rows可以从返回的sapply列表中获得类似矩阵的data.frame。要获取剩余数据,您只需在cbind之前放置-

keep.rows