【问题标题】:Delete columns based on average根据平均值删除列
【发布时间】:2021-10-12 04:32:16
【问题描述】:

我有这个矩阵:

row c1  c2  c3  c4  c5
R1  27  38  94  40  4
R2  69  16  85  2   15
R3  30  35  64  95  6
R4  20  33  77  98  55
R5  20  44  60  33  89
R6  12  88  87  44  38

我想删除矩阵中平均小于 30 的所有列。colMeans 是如何完成的?

【问题讨论】:

    标签: r matrix filter mean


    【解决方案1】:

    我们可以使用colMeans(假设rowrow.namesrow.names

    m1[, colMeans(m1, na.rm = TRUE) >= 30, drop = FALSE]
    

    -输出

       c2 c3 c4 c5
    R1 38 94 40  4
    R2 16 85  2 15
    R3 35 64 95  6
    R4 33 77 98 55
    R5 44 60 33 89
    R6 88 87 44 38
    

    如果row 是一列,那么它作为matrix 没有意义,因为matrix 只能有一个类型,因此任何字符元素都会将整个矩阵更改为character。可能data.frame 会更好,即

    df1[, c(TRUE, colMeans(df1[-1], na.rm = TRUE) >= 30), drop = FALSE]
    

    -输出

     row c2 c3 c4 c5
    1  R1 38 94 40  4
    2  R2 16 85  2 15
    3  R3 35 64 95  6
    4  R4 33 77 98 55
    5  R5 44 60 33 89
    6  R6 88 87 44 38
    

    数据

    m1 <- structure(c(27L, 69L, 30L, 20L, 20L, 12L, 38L, 16L, 35L, 33L, 
    44L, 88L, 94L, 85L, 64L, 77L, 60L, 87L, 40L, 2L, 95L, 98L, 33L, 
    44L, 4L, 15L, 6L, 55L, 89L, 38L), .Dim = 6:5, .Dimnames = list(
        c("R1", "R2", "R3", "R4", "R5", "R6"), c("c1", "c2", "c3", 
        "c4", "c5")))
    
    df1 <- structure(list(row = c("R1", "R2", "R3", "R4", "R5", "R6"), c1 = c(27L, 
    69L, 30L, 20L, 20L, 12L), c2 = c(38L, 16L, 35L, 33L, 44L, 88L
    ), c3 = c(94L, 85L, 64L, 77L, 60L, 87L), c4 = c(40L, 2L, 95L, 
    98L, 33L, 44L), c5 = c(4L, 15L, 6L, 55L, 89L, 38L)), 
    class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      【解决方案2】:

      这是另一种选择(但效率不如@akrun's solution

      > as.matrix(Filter(function(x) mean(x) >= 30, data.frame(m)))
         c2 c3 c4 c5
      R1 38 94 40  4
      R2 16 85  2 15
      R3 35 64 95  6
      R4 33 77 98 55
      R5 44 60 33 89
      R6 88 87 44 38
      

      【讨论】:

        【解决方案3】:

        如果我们将矩阵更改为数据框,我们可以使用 select 条件:(从 akrun 借来的数据)

        df1 %>% 
            select(which(colMeans(.) >= 30))
        

        输出:

           c2 c3 c4 c5
        R1 38 94 40  4
        R2 16 85  2 15
        R3 35 64 95  6
        R4 33 77 98 55
        R5 44 60 33 89
        R6 88 87 44 38
        

        【讨论】:

          【解决方案4】:

          另一个,可能效率不高:

          m1[, t(m1) %*% rep(1, dim(m1)[1])/dim(m1)[1] >= 30]
          
          #>    c2 c3 c4 c5
          #> R1 38 94 40  4
          #> R2 16 85  2 15
          #> R3 35 64 95  6
          #> R4 33 77 98 55
          #> R5 44 60 33 89
          #> R6 88 87 44 38
          

          【讨论】:

            猜你喜欢
            • 2020-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-22
            • 1970-01-01
            • 2014-11-04
            • 1970-01-01
            相关资源
            最近更新 更多