根据平均值删除列

Delete columns based on average

我有这个矩阵:

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 如何做到这一点?

我们可以使用colMeans(假设rowmatrixrow.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))

这是另一种选择(但效率不如

> 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

如果我们将矩阵更改为数据框,我们可以使用 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

另一个,可能不是很有效:

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