获取具有最大组平均值的组行的最快解决方案

问题描述 投票:0回答:1

Reprex

假设我有一个数字矩阵

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

)。请包括一个基准。在我的实际问题中,我有一个包含数千个矩阵的列表,每个矩阵都有数千行。

r performance grouping
1个回答
0
投票
这个基本的 R 解决方案很简单,而且应该不会很慢。

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

创建于 2023-11-15,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.