Найдите групповой максимум и выведите соответствующую строку в R - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть такой фрейм данных:

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, поэтому я сравниваю столбец V1 в 2 строках R2 и R8. Его 12 и 18, так что R8 будет результатом, который я хочу получить.

V2 находится в строках R7 и R9, поэтому я сравниваю столбец V2 R7 и R9. Его -9 и -4, поэтому результат будет R7 для -9 (знаки не имеют значения).

Пока что я просто поднастроил данные в соответствии с MAX, поэтому я получил 5 отдельных фреймов данных, а затем отсортировал соответствующий столбец вручную. Есть ли более быстрый способ?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Другая возможность 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» как символ и возвращает максимальное абсолютное значение.Затем он сохраняет строки с максимальным абсолютным значением.

2 голосов
/ 12 апреля 2019

Вы не указываете, как вы хотите структурировать вывод, но вот идея с 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
...