替换矩阵中的每一行

时间:2011-08-13 15:22:02

标签: r

我有一个矩阵(mat1),比如100行和100列;我想创建另一个矩阵,其中每一行与mat1中的第一行相同(除了我想将第一列保持为原始值)

我设法使用循环:

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)]

有人可以指出我的错误吗?!

谢谢,
克里斯

3 个答案:

答案 0 :(得分:8)

问题是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 :(得分:1)

尝试

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

答案 2 :(得分: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