【问题标题】:R - Filter matrix by duplicate valuesR - 按重复值过滤矩阵
【发布时间】:2015-05-23 09:06:12
【问题描述】:

我有以下矩阵:

      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    1    3    5    1
[2,]    3    5    4    6    7    2

我需要过滤此矩阵,以便删除第 1 行中具有重复元素的列,仅留下第 2 行中具有最大值的列。因此在此示例中,输入矩阵的第 1 列和第 6 列需要删除:

      [,1] [,2] [,3] [,4]
[1,]    2    1    3    5
[2,]    5    4    6    7

在 R 中有没有简单的方法来做到这一点?

谢谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您可以计算每个第一行元素的最大第二行值,然后只保留第二行是第一行元素最大值的列:

    (maxes <- tapply(mat[2,], mat[1,], max))
    # 1 2 3 5 
    # 4 5 6 7 
    (mat2 <- mat[,maxes[as.character(mat[1,])] == mat[2,]])
    #      [,1] [,2] [,3] [,4]
    # [1,]    2    1    3    5
    # [2,]    5    4    6    7
    

    如果您希望第二行中的最大值出现相同的情况并希望删除重复的列,您可以在这两个命令之后使用mat2[!duplicated(mat2[,1]),]

    【讨论】:

      【解决方案2】:

      你可以使用ave

       res <- mat[,!!ave(mat[2,], mat[1,], FUN=function(x) x==max(x))]
       res
       #     [,1] [,2] [,3] [,4]
       #[1,]    2    1    3    5
       #[2,]    5    4    6    7
      

      注意:如果数据集中存在关联,您可以删除这些列

       res[,!duplicated(split(res, col(res)))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多