【问题标题】:Add a column with the value of the object with max frequency添加具有最大频率的对象的值的列
【发布时间】:2016-07-19 14:37:38
【问题描述】:

我有这个矩阵:

mat=matrix(c(1,1,1,2,2,2,3,4,
             4,4,4,4,4,3,5,6,
             3,3,5,5,6,8,0,9,
             1,1,1,1,1,4,5,6),nrow=4,byrow=TRUE)
print(mat)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    2    2    2    3    4
[2,]    4    4    4    4    4    3    5    6
[3,]    3    3    5    5    6    8    0    9
[4,]    1    1    1    1    1    4    5    6

以及我想要应用我的函数的行的索引的子集:

subset=c(2,4)

我想在矩阵“mat”中添加一个新列,该列仅包含我指定的子集,该行中具有最大频率的对象的值。

在这种情况下:

  • 对于第 1 行,我想在新列中有一个空单元格,
  • 对于第 2 行,我希望在新列中有值“4”,
  • 对于第 3 行,我想在新列中有一个空单元格,
  • 对于第 4 行,我希望在新列中具有值“1”。

编辑: 感谢答案中的代码! 现在我应该用其他值替换 NA 值: 我有另一个矩阵:

mat2=matrix(c(24,1,3,2, 4,4,4,4, 3,2,2,5, 1,3,5,1),nrow=4,byrow=TRUE)

     [,1] [,2] [,3] [,4]
[1,]   24    1    3    2
[2,]    4    4    4    4
[3,]    3    2    2    5
[4,]    1    3    5    1

和子集:

subset=c(1,3)

我想用具有最大值的行的值的列名替换矩阵的NA(第一个子集中的剩余行)。

在这种情况下,第一行是“1”,第三行是“4”。

【问题讨论】:

    标签: r matrix max subset frequency


    【解决方案1】:

    您正在寻找该模式。不幸的是,R 没有提供内置模式功能。不过自己写一个也不难:

    ## create mode function
    modeValue <- function(x) {
      ux <- unique(x)
      ux[which.max(tabulate(match(x, ux)))]
    }
    
    ## add new column with NA
    smat <- cbind(mat, NA)
    
    ## calculate mode for subset
    smat[subset, ncol(smat)] <- apply(smat[subset, , drop=FALSE], 1, modeValue)
    smat
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    # [1,]    1    1    1    2    2    2    3    4   NA
    # [2,]    4    4    4    4    4    3    5    6    4
    # [3,]    3    3    5    5    6    8    0    9   NA
    # [4,]    1    1    1    1    1    4    5    6    1
    

    【讨论】:

      【解决方案2】:

      这是一个可行的功能。它为所有行计算此类值(模式),然后在需要的地方替换缺失值:

      myFunc <- function(x, myRows) {
      
        myModes <- apply(mat, 1, FUN=function(i) {
                      temp<- table(i)
                      as.numeric(names(temp)[which.max(temp)])
                   })
        myModes[setdiff(seq.int(nrow(x)), myRows)] <- NA
        myModes
      }
      

      例如,返回

      myFunc(mat, c(2,4))
      [1] NA  4 NA  1
      

      要将其添加到您的矩阵中,只需使用cbind

      cbind(mat, myFunc(mat, c(2,4)))
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
      [1,]    1    1    1    2    2    2    3    4   NA
      [2,]    4    4    4    4    4    3    5    6    4
      [3,]    3    3    5    5    6    8    0    9   NA
      [4,]    1    1    1    1    1    4    5    6    1
      

      【讨论】:

        猜你喜欢
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        相关资源
        最近更新 更多