我有一个矩阵(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)]
有人可以指出我的错误吗?!
谢谢,
克里斯
答案 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