假设我有一个数字矩阵
m
:
m <- as.matrix(iris[-5])
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# [1,] 5.1 3.5 1.4 0.2
# [2,] 4.9 3.0 1.4 0.2
# [3,] 4.7 3.2 1.3 0.2
# ...
还有一个向量
groups
,对 m
的行进行分组:
groups <- as.character(iris$Species)
# [1] "setosa" "setosa" "setosa" ...
对于所有列中平均值最大的组,返回 m
行的
最快方法是什么?如果可能的话,我还想跟踪原始行号。
在此示例中,组
"virginica"
具有最大平均值:
sapply(split(m, groups), mean)
# setosa versicolor virginica
# 2.5355 3.5730 4.2850
所以预期的输出是:
m[groups == "virginica", ]
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# [1,] 6.3 3.3 6.0 2.5
# [2,] 5.8 2.7 5.1 1.9
# [3,] 7.1 3.0 5.9 2.1
# ...
正如提到的子设置后行号重置一样,我对一个也能跟踪原始行号的解决方案感兴趣(在这种情况下,这些将是
101-150
)。
我读到的大多数 SO 问题往往集中在获取每组中内最大值的行,而不是返回具有最大平均值的组中的行。
因此,一种潜在的解决方案(不跟踪行号)是:
m[groups == names(which.max(sapply(split(m, groups), mean))),]
但我很好奇是否有更快的选择(我猜最快的选择可能是data.table
)。请包括一个基准。在我的实际问题中,我有一个包含数千个矩阵的列表,每个矩阵都有数千行。
rowMeans
用 C 语言编码,是一个快速函数。仅打印前 6 行。
vec <- as.matrix(iris[-5]) |> rowMeans()
s <- tapply(vec, iris$Species, mean) |> which.max() |> names()
iris[iris$Species == s, ] |> head()
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 101 6.3 3.3 6.0 2.5 virginica
#> 102 5.8 2.7 5.1 1.9 virginica
#> 103 7.1 3.0 5.9 2.1 virginica
#> 104 6.3 2.9 5.6 1.8 virginica
#> 105 6.5 3.0 5.8 2.2 virginica
#> 106 7.6 3.0 6.6 2.1 virginica
创建于 2023-11-15,使用 reprex v2.0.2
s <- iris[-5] |>
as.matrix() |>
rowMeans() |>
tapply(iris$Species, mean) |>
which.max() |>
names()
iris[iris$Species == s, ] |> head()
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 101 6.3 3.3 6.0 2.5 virginica
#> 102 5.8 2.7 5.1 1.9 virginica
#> 103 7.1 3.0 5.9 2.1 virginica
#> 104 6.3 2.9 5.6 1.8 virginica
#> 105 6.5 3.0 5.8 2.2 virginica
#> 106 7.6 3.0 6.6 2.1 virginica