查找分组最大值并在 R 中打印相关行

Posted

技术标签:

【中文标题】查找分组最大值并在 R 中打印相关行【英文标题】:Find a groupwise maximum and print the relevant row in R 【发布时间】:2019-09-03 06:12:33 【问题描述】:

我有一个这样的数据框:

V1  V2  V3  V4  V5   MAX   ROW
 2   5  -8  19  -20   V5    R1
12   3   5   6   -9   V1    R2
 5   7   8  -1   19   V5    R3
 3  -2  -5   2    4   V3    R4
 6   1  -1  15    9   V4    R5
-3  -4   7   2    8   V5    R6
-6  -9   3   6    2   V2    R7
18  11  -3  13    2   V1    R8
-3  -4   7   2    8   V2    R9
-2  -3   4   7    4   V4    R10
-7  -5  27   3    1   V3    R11

V1-V5是数据列,MAX表示每一行中绝对值最高的列名,ROW只是一个行计数器。

我想找到按 MAX 分组的每一列的绝对最大值,由 ROW 编号给出。

例如:

V1 中的最大值在 R2 和 R8 行,所以我比较了 2 行 R2 和 R8 的 V1 列。它的 12 和 18,所以 R8 将是我想要得到的结果。

V2 在 R7 和 R9 行,所以我比较 R7 和 R9 的 V2 列。它的 -9 和 -4 因此结果将是 -9 的 R7(符号无关紧要)。

到目前为止,我只是根据 MA​​X 对数据进行子集化,所以我得到了 5 个单独的数据框,然后我手动对相关列进行了排序。有更快的方法吗?

【问题讨论】:

【参考方案1】:

您没有指定输出结构的方式,但这是tidyverse 的一个想法,我们在其中融合数据框和过滤器,即

library(tidyverse)

df %>%
 gather(var, val, - c(6, 7)) %>%
 filter(MAX == var) %>%
 group_by(MAX) %>%
 slice(which.max(abs(val))) %>%
 select(-var)

给出,

# A tibble: 5 x 3
# Groups:   MAX [5]
  MAX   ROW     val
  <fct> <fct> <int>
1 V1    R8       18
2 V2    R7       -9
3 V3    R11      27
4 V4    R5       15
5 V5    R1      -20

【讨论】:

谢谢!输出的结构并不相关,我需要的只是任何形式的行号。你的想法看起来很有希望,我马上试试,谢谢! 这是有效的,但它给了我负值的错误行。我需要最高的绝对值...例如 -9 大于 5。 只需将 val 包裹在 abs() 我已经尝试过了,但这不知怎的给了我每一个结果。它只给我具有正值的行。 好的,现在看看【参考方案2】:

dpylr 的另一种可能性可能是:

df %>%
 group_by(MAX) %>%
 mutate(res = max(abs(eval(as.symbol(MAX))))) %>%
 filter(res == abs(eval(as.symbol(MAX))))

     V1    V2    V3    V4    V5 MAX   ROW     res
  <int> <int> <int> <int> <int> <chr> <chr> <int>
1     2     5    -8    19   -20 V5    R1       20
2     6     1    -1    15     9 V4    R5       15
3    -6    -9     3     6     2 V2    R7        9
4    18    11    -3    13     2 V1    R8       18
5    -7    -5    27     3     1 V3    R11      27

在这里,首先,按“MAX”分组,将“MAX”作为符号计算并返回最大绝对值。然后,它保留具有最大绝对值的行。

【讨论】:

以上是关于查找分组最大值并在 R 中打印相关行的主要内容,如果未能解决你的问题,请参考以下文章

查找分组的最大计数

根据列中的一组查找最大值行并在熊猫中进行透视

R - 对连续变量标题进行分组,将分类变量因子作为行并聚合为最小值、最大值、平均值

在python的数据框中分组和打印最大值

查找列表的“最佳”项并在python中打印第一个实例的索引位置[重复]

使用R查找包含最大值的行索引