我有以下矩阵
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
答案 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