【问题标题】:Replacing every row in a matrix替换矩阵中的每一行
【发布时间】:2011-08-13 15:22:01
【问题描述】:

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


    【解决方案1】:

    问题在于 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
    

    这是因为当我们使用 "each" 参数时,rep() 调用会复制向量中的每个值,而不是复制(重复)向量:

    > 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) 的方式完全扩展了替换向量,当与按列填充原则相结合时,就会产生您所看到的行为。

    【讨论】:

      【解决方案2】:

      试试

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

      【讨论】:

        【解决方案3】:

        另一种选择...

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-15
          • 2020-09-25
          • 1970-01-01
          • 2016-09-10
          相关资源
          最近更新 更多