【问题标题】:Create a new matrix based on a previous one in R根据 R 中的前一个矩阵创建一个新矩阵
【发布时间】:2020-02-21 04:04:39
【问题描述】:

我有一个矩阵如下:

         >  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 中创建新矩阵?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用

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

    【讨论】:

    • 谢谢你的回答,但是新矩阵的第二列不对。
    • @shany 对不起,它需要否定。更新
    • 如果不是在新矩阵的最后一行和第一列使用一个,我想将值放在R中前一个矩阵的最后一行和第一列,我该怎么办?跨度>
    • 最后一行和第一列中的任何值。
    【解决方案2】:

    扩展示例数据以说明 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.复制mnew_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多