Возвращать имена столбцов в зависимости от условия - PullRequest
0 голосов
/ 30 октября 2018

У меня есть набор данных с 18 столбцами, из которого мне нужно вернуть имена столбцов с самыми высокими значениями для каждого наблюдения, простой пример ниже. Я наткнулся на этот ответ, и он почти делает то, что мне нужно, но в некоторых случаях мне нужно объединить имена (например, ab в maxcol ниже). Как мне это сделать?

Любые предложения будут с благодарностью! Если бы это было возможно, мне было бы легче понять решение на основе Tidyverse, так как я больше знаком с этим, чем с базой.

Редактировать: я забыл упомянуть, что некоторые столбцы в моих данных имеют NA.

library(dplyr, warn.conflicts = FALSE)

#turn this
Df <- tibble(a = 4:2, b = 4:6, c = 3:5)

#into this
Df <- tibble(a = 4:2, b = 4:6, c = 3:5, maxol = c("ab", "b", "b"))

Создан в 2018-10-30 пакетом Представление (v0.2.1)

1 Ответ

0 голосов
/ 30 октября 2018

Продолжая ответ в сообщении , мы можем сделать

Df$maxcol <- apply(Df, 1, function(x) paste0(names(Df)[x == max(x)], collapse = ""))

Df

#      a     b     c maxcol
#  <int> <int> <int> <chr> 
#1     4     4     3  ab    
#2     3     5     4  b     
#3     2     6     5  b 

Для каждой строки мы проверяем, какая позиция имеет максимальные значения, и paste names в этой позиции вместе.


Если вы предпочитаете tidyverse подход

library(tidyverse)
Df %>%
  mutate(row = row_number()) %>%
  gather(values, key, -row) %>%
  group_by(row) %>%
  mutate(maxcol = paste0(values[key == max(key)], collapse = "")) %>%
  spread(values, key) %>%
  ungroup() %>%
  select(-row)

# maxcol     a     b     c
#  <chr>  <int> <int> <int>
#1 ab         4     4     3
#2 b          3     5     4
#3 b          2     6     5

Сначала мы преобразуем фрейм данных из широкого в длинный, используя gather, затем group_by в каждой строке мы paste имена столбцов для max key, а затем spread длинный фрейм данных снова в широкий.

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