如何替换矩阵中的偶数列或奇数列?

时间:2014-10-10 08:44:38

标签: r

例如,如果a有这样的矩阵:

realmatrix=matrix(1:16,ncol=4,nrow=4)

哪会这样:

      [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

我想创建一个函数来替换具有特定值的两列(例如1:4),如果它具有偶数列,那么结果应该是这样的:

   [,1] [,2] [,3] [,4]
[1,]  1    1    1   13
[2,]  2    2    2   14
[3,]  3    3    3   15
[4,]  4    4    4   16

如果矩阵具有奇数个列,则该函数应仅替换奇数列,即中心列:

这是具有奇数列的矩阵:

realmatrix2=matrix(1:12,ncol=3,nrow=4)

最终结果:

     [,1] [,2] [,3]
[1,]    1    1    9
[2,]    2    2   10
[3,]    3    3   11
[4,]    4    4   12

非常感谢!

1 个答案:

答案 0 :(得分:0)

尝试:

  fun2 <- function(mat, val){
          stopifnot(length(val)==nrow(mat))
           n <- ncol(mat)
           if( (n/2) %%2 ==0){
           mat[, c(n/2, n/2+1)] <- val
            }
           else {
           mat[, ceiling(n/2)] <- val
           }
           mat
          }

  fun2(realmatrix, 1:4)
   #      [,1] [,2] [,3] [,4]
   #[1,]    1    1    1   13
   #[2,]    2    2    2   14
   #[3,]    3    3    3   15
   #[4,]    4    4    4   16


  fun2(realmatrix2,1:4)
  #       [,1] [,2] [,3]
  #[1,]    1    1    9
  #[2,]    2    2   10
  #[3,]    3    3   11
  #[4,]    4    4   12

  realmatrix5=matrix(1:32, ncol=8,nrow=4)
  fun2(realmatrix5, 1:4)
  #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
  #[1,]    1    5    9    1    1   21   25   29
  #[2,]    2    6   10    2    2   22   26   30
  #[3,]    3    7   11    3    3   23   27   31
  #[4,]    4    8   12    4    4   24   28   32

更新

如果要更改行:

 funR <- function(mat, val){
        stopifnot(length(val)==ncol(mat))
        n <- nrow(mat)
        if((n/2) %%2==0){
        mat[c(n/2, n/2+1),] <- rep(val, each=2)
         }
         else {
        mat[ceiling(n/2),] <- val
         }
        mat
        }


 funR(realmatrix, 1:4)
 #     [,1] [,2] [,3] [,4]
 #[1,]    1    5    9   13
 #[2,]    1    2    3    4
 #[3,]    1    2    3    4
 #[4,]    4    8   12   16


 realmatrix3 <- matrix(1:15, ncol=5)
  funR(realmatrix3, 1:5)
 #      [,1] [,2] [,3] [,4] [,5]
 #[1,]    1    4    7   10   13
 #[2,]    1    2    3    4    5
 #[3,]    3    6    9   12   15