如何在R中将矩阵分成较小的矩阵?

时间:2012-10-25 00:41:39

标签: r matrix

我有以下矩阵

2    4    1
6    32   1
4    2    1
5    3    2
4    2    2

我想基于第3列

制作以下两个矩阵

第一

2    4
6    32
4    2

第二

5    3
4    2

我能想出最好的,但是我收到了错误

  

x< - cbind(mat [,1],mat [,2])if mat [,3] = 1

     

y< - cbind(mat [,1],mat [,2])if mat [,3] = 2

4 个答案:

答案 0 :(得分:10)

如果mat是您的矩阵:

mat <- matrix(1:15,ncol=3)
mat[,3] <- c(1,1,1,2,2)
> mat
     [,1] [,2] [,3]
[1,]    1    6    1
[2,]    2    7    1
[3,]    3    8    1
[4,]    4    9    2
[5,]    5   10    2

然后您可以使用split

> lapply( split( mat[,1:2], mat[,3] ), matrix, ncol=2)
$`1`
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8

$`2`
     [,1] [,2]
[1,]    4    9
[2,]    5   10

lapply的{​​{1}}是必需的,因为拆分会删除使矢量成为矩阵的属性,因此您需要将它们重新添加。

答案 1 :(得分:5)

又一个例子:

#test data
mat <- matrix(1:15,ncol=3)
mat[,3] <- c(1,1,1,2,2)

#make a list storing a matrix for each id as components
result <- lapply(by(mat,mat[,3],identity),as.matrix)

最终产品:

> result
$`1`
  V1 V2 V3
1  1  6  1
2  2  7  1
3  3  8  1

$`2`
  V1 V2 V3
4  4  9  2
5  5 10  2

答案 2 :(得分:4)

如果你有一个矩阵A,当第三列为1时,这将得到前两列:

A[A[,3] == 1,c(1,2)]

您可以使用它来获取第三列中任何值的矩阵。

说明:A [,3] == 1返回一个布尔值向量,如果A [i,3]为1,则第i个位置为TRUE。这个布尔值向量可用于索引矩阵到提取我们想要的行。

免责声明:我对R的经验很少,这是MATLAB的方法。

答案 3 :(得分:1)

这是pedrosorio想法的功能版本:

 getthird <- function(mat, idx) mat[mat[,3]==idx, 1:2]
 sapply(unique(mat[,3]), getthird, mat=mat)  #idx gets sent the unique values
#-----------
[[1]]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8

[[2]]
     [,1] [,2]
[1,]    4    9
[2,]    5   10