根据R中的前一个矩阵创建一个新矩阵

时间:2020-02-20 19:45:36

标签: r

我的矩阵如下:

         >  Mat=matrix(c(1,1,0,1,1,2,1,Inf), nrow=4, ncol=2)
         > Mat
             [,1] [,2]
       [1,]    1    1
       [2,]    1    2
       [3,]    0    1
       [4,]    1  Inf

我想基于上述矩阵创建一个新矩阵,如下所示:当第一列的值等于第二列时,将相同的值放在新矩阵的第一列中,当我们有两个不同的值时在两列中,将新矩阵的第一列的两个值的平均值放入,而当第二列的值为Inf时,将第一列的值放入新矩阵的第一列中。对于新矩阵的第二列值,仅当第一个矩阵中的第二列的值是Inf时,才将该值等于0,否则等于1。最后一个新矩阵如下:

      > newMat=matrix(c(1,1.5,0.5,1, 1,1,1,0), nrow=4,ncol=2)
      > newMat
           [,1] [,2]
      [1,]  1.0    1
      [2,]  1.5    1
      [3,]  0.5    1
      [4,]  1.0    0

如何在R中创建新矩阵?

2 个答案:

答案 0 :(得分:2)

我们可以使用

Mat[,1]  <-  rowMeans(Mat)
i1 <- is.infinite(Mat[,2])
Mat[,2] <- +(!i1)
Mat[i1,1] <- 1

答案 1 :(得分:1)

扩展示例数据以说明inf在第一列中的情况;

m <- matrix(c(1, 1, 0, 1, Inf, 1, 2, 1, Inf, 1), ncol=2)
m

     [,1] [,2]
[1,]    1    1
[2,]    1    2
[3,]    0    1
[4,]    1  Inf
[5,]  Inf    1

使用基数R的解决方案:

1。将m复制到new_m

m_new <- m

2。确定需要更改值的行:

different_values <- m[, 1] != m[, 2]
second_is_inf <- is.infinite(abs(m[, 2]))

3。应用更改:

m_new[different_values & !second_is_inf, 1] <- rowSums(m[different_values & !second_is_inf, 1:2])/2

m_new[second_is_inf, 2] <- 0


m_new

返回:

     [,1] [,2]
[1,]  1.0    1
[2,]  1.5    2
[3,]  0.5    1
[4,]  1.0    0
[5,]  Inf    1