我有一个这样的数据框:
HandleProcessCorruptedStateExceptionsAttribute
V1-V5是数据列,MAX在每一行中显示最高绝对值的列名,而ROW只是行计数器。
我想找到按ROW编号给出的按MAX分组的每一列的绝对最大值。
例如:
V1中的Maxima位于R2和R8行中,因此我比较了R2和R8两行的V1列。它的12和18,所以R8是我想要得到的结果。
V2在R7和R9行中,因此我比较了R7和R9的V2列。它的-9和-4,因此结果将是-9的R7(符号无关紧要)。
到目前为止,我只是根据MAX对数据进行了子集化,所以我得到了5个单独的数据帧,然后手动对相关列进行了排序。有没有更快的方法?
答案 0 :(得分:2)
您没有指定如何构造输出,但这是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
答案 1 :(得分: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”评估为符号并返回最大绝对值。然后,它使行具有最大绝对值。