根据平均值删除列
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
(假设row
是matrix
的row.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
我有这个矩阵:
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
(假设row
是matrix
的row.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