2011-08-13 45 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 
相关问题