2011-08-13 41 views
4

我有一個矩陣(mat1),比如100行和100列;我想創建另一個矩陣,其中每一行是相同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

問題爲R填充矩陣,按列的方式。下面是示出一個簡單的例子:

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]是向量4,7,你可以看到,R已經用於填充的mat2逐列的比特。你想要一個按行的操作。

一種解決方案是複製置換載體多次是必需的:

> 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 

此工作,因爲該rep()呼叫複製向量中的每個值當我們使用"each"參數,而不是複製(重複)向量:

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

默認行爲也會給錯誤的答案:

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

部分原因,您看到的問題也是R將參數擴展到替換的適當長度的方式。 R實際上並且默默地擴展了替換向量,正如rep(mat1[1, -1], nrow(mat1)-1)那樣,當它與逐列原理相結合時,給出了你所看到的行爲。

1

嘗試

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 
相關問題