gpt4 book ai didi

替换矩阵中的每一行

转载 作者:行者123 更新时间:2023-12-04 22:50:29 27 4
gpt4 key购买 nike

我有一个矩阵 (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)]

有人能指出我的错误吗?!

谢谢,
克里斯

最佳答案

问题是 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) 的方式扩展了替换向量。确实如此,当与按列填充原则结合使用时,就会产生您所看到的行为。

关于替换矩阵中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com