Определение максимального значения в строке из нескольких столбцов с выводом, включающим все столбцы в наборе данных? - PullRequest
1 голос
/ 26 марта 2020

У меня довольно большой набор данных, и мне нужно определить максимальное значение каждой строки из нескольких столбцов. Таким образом, в приведенных ниже примерах данных для «II», какое самое высокое значение, и если наибольшее значение в «N» или «P». Я знаю, что подобные вопросы были опубликованы ранее, однако мне нужны выходные данные, чтобы не удалять другие столбцы метаданных в моем наборе данных. Это также означает, что мне нужно указать диапазон столбцов, которые должны быть включены в запрос «max». Заранее благодарим за любые указания с этим.

data<-data_frame(Exp = c("I", "II", "III", "IV", "V", "VI", "VII", "VIII"),
                  N = c(8.77, 1.67, 7.47, 7.58, 1.1, 8.9, 7.5, 7.7),
                  P = c(1.848, 3.029, 1.925, 2.725, 1.900, 3.100, 
                                    2.000, 9.800))

Я пробовал несколько вариантов кода ниже

test %>% 
  mutate(Max = pmax(!!! rlang::syms(names(.)[c("N", "P"),]))) %>% 
  group_by(data, Exp) %>% 
  summarise(Max = max(Max))

и получаю ошибку: Ошибка в UseMethod ("mutate_"): нет применимого метода для 'mutate_', примененного к объекту класса "function"

Это мой первый вопрос, заданный здесь, поэтому извиняюсь за неправильное форматирование et c, любые советы по этому (и мой вопрос ) будет высоко ценится.

1 Ответ

0 голосов
/ 27 марта 2020

Я рассматриваю это в два этапа

  1. найти максимальное значение столбцов
  2. найти метку, которая соответствует максимальному значению (допустим, не равны значения)

Если у вас есть только два столбца N и P, то это просто сделать с помощью case_when.

data2 = data %>%
  mutate(max_val = pmax(N,P)) %>%                  # find max
  mutate(source = case_when(max_val == N ~ "N",    # find label
                            max_val == P ~ "P"))

Однако, если число столбцов или имен столбцов равно Dynami c тогда это становится сложнее. У меня работает следующее:

cols = c("N", "P")    # list of column names to work with

data2 = data %>%
  mutate(max_val = pmax(!!!syms(cols))) %>%   # find max
  mutate(source = NA)                         # initialize blank labels

# iterate to find labels
data3 = data2
for(c in cols)
  data3 = mutate(data3, source = ifelse(is.na(source) & max_val == !!sym(c), c, source))

Возможно, есть способ объединить sym с case_when, чтобы вам не приходилось перебирать метки. Если кто-то найдет его, пожалуйста, опубликуйте обновление к этому ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...