5

次のマトリックスがあります

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

3列目に基づいて次の2つの行列を作成したい

最初

2    4
6    32
4    2

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

4 に答える 4

12

あなた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

split はベクトルを行列にするアトリビュートを削除するため、lapplyofmatrixが必要です。そのため、アトリビュートを再度追加する必要があります。

于 2012-10-25T00:45:43.813 に答える
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
于 2012-10-25T02:14:32.750 に答える
4

行列 A がある場合、3 番目の列が 1 の場合、最初の 2 列が取得されます。

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

これを使用して、3 列目の任意の値の行列を取得できます。

説明: A[,3] == 1 は、ブール値のベクトルを返します。ここで、A[i,3] が 1 の場合、i 番目の位置は TRUE です。このブール値のベクトルを使用して、行列にインデックスを付けて行を抽出できます。私たちは欲しい。

免責事項: 私は R の経験がほとんどありません。これは MATLAB 風の方法です。

于 2012-10-25T00:48:15.383 に答える
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
于 2012-10-25T01:03:53.400 に答える