找到分组最大值并在 R 中打印相关行
Find a groupwise maximum and print the relevant row in R
我有一个这样的数据框:
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 中的 Maxima 在 R2 和 R8 行,所以我比较了 R2 和 R8 两行的 V1 列。它是 12 和 18,所以 R8 将是我想要得到的结果。
V2 在R7 和R9 行,所以我比较R7 和R9 的V2 列。它是 -9 和 -4,所以结果将是 -9 的 R7(符号无关紧要)。
到目前为止,我只是根据 MAX 对数据进行子集化,所以我得到了 5 个单独的数据帧,然后我手动对相关列进行了排序。有没有更快的方法?
您没有指定输出的结构,但这里有一个 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
另一种 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" 作为符号和 returns 最大绝对值。然后,它保留具有最大绝对值的行。
我有一个这样的数据框:
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 中的 Maxima 在 R2 和 R8 行,所以我比较了 R2 和 R8 两行的 V1 列。它是 12 和 18,所以 R8 将是我想要得到的结果。
V2 在R7 和R9 行,所以我比较R7 和R9 的V2 列。它是 -9 和 -4,所以结果将是 -9 的 R7(符号无关紧要)。
到目前为止,我只是根据 MAX 对数据进行子集化,所以我得到了 5 个单独的数据帧,然后我手动对相关列进行了排序。有没有更快的方法?
您没有指定输出的结构,但这里有一个 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
另一种 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" 作为符号和 returns 最大绝对值。然后,它保留具有最大绝对值的行。