2011-08-13 7 views
4

行列(mat1)があります。たとえば100行と100列です。私はループを使用して、これを行うことができた(私は元の値として第一COLを維持したいことを除いて)MAT1に行列のすべての行を置換する

をすべての行が1行目と同じである別のマトリックスを作成したい:

mat2 <- mat1 

for(i in 1:nrow(mat1)) 
{ 
    mat2[i,2:ncol(mat2)] <- mat1[1,2:ncol(mat1)] 
} 

これはうまくいくと思います。しかし、私はループなしでそれを行う方法があるべきだと思っていたでしょう。私は試しました:

mat2 <- mat1 
mat2[c(2:100),2:ncol(mat2)] <- mat1[1,2:ncol(mat1)] 

誰かが私のエラーを指摘できますか?

おかげで、
クリス

答えて

7

を試してみてください。ここではこのことを示して簡単な例です:

mat1 <- matrix(1:9, ncol = 3) 
mat2 <- matrix(1:9, ncol = 3) 

mat2[-1, -1] <- mat1[1, -1] 
mat2 

> mat2 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 4 4 
[3,] 3 7 7 

mat1[1, -1]あなたはRはmat2列方向のビットを埋めるために使用していることがわかりますベクトル4,7、です。行単位の操作が必要でした。

一つの解決策は、必要とされるように置換ベクターを何度でも複製することです:

> mat2[-1, -1] <- rep(mat1[1, -1], each = nrow(mat1)-1) 
> mat2 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 4 7 
[3,] 3 4 7 

我々は"each"引数を使用する場合rep()コールではなく、繰り返し(複製のは、ベクタの各値を複製ので、これは動作します)ベクトル:

> rep(mat1[1, -1], each = nrow(mat1)-1) 
[1] 4 4 7 7 

は、デフォルトの動作でも、間違った答えを与えるだろう:

あなたが見ている問題は、Rが引数を適切な長さに置き換えて置換する方法でもあります。実際には、そして静かに、置換ベクトルを正確にrep(mat1[1, -1], nrow(mat1)-1)のように拡張しました。これはfill-by-columnの原理と組み合わせると、あなたが見た振る舞いを与えました。

1

は問題が柱で、Rは、行列を埋める方法です

mat2[c(2:nrow(mat2)), 2:ncol(mat2)] <- mat1[rep.int(1,nrow(mat1)-1),2:ncol(mat1)] 
1

別のオプション...

n = 5 
mat1 = matrix(sample(n^2, n^2), n, n) 

# use matrix with byrow to copy 1st row n times 
mat2 = matrix(rep(mat1[1, ], n), n, n, byrow = TRUE) 

# copy 1st column 
mat2[ , 1] = mat1[ , 1] 

mat1 
mat2 
関連する問題