Используйте dplyr, чтобы добавить новый столбец на основе максимального значения строки? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть большая база данных, в которой есть ряд столбцов с числовыми значениями.Я хотел бы использовать dplyr для добавления нового столбца, mutate, который имеет в качестве своих значений имена столбцов, которые имеют максимальное значение.Так, для приведенного ниже примера

set.seed(123)
data_frame(
  bob = rnorm(10),
  sam = rnorm(10),
  dick = rnorm(10)
    )
# A tibble: 5 x 3
      bob    sam   dick
    <dbl>  <dbl>  <dbl>
1 -0.560   1.72   1.22 
2 -0.230   0.461  0.360
3  1.56   -1.27   0.401
4  0.0705 -0.687  0.111
5  0.129  -0.446 -0.556

новый столбец будет равен c ('sam', 'sam', 'bob', 'dick', 'bob'), поскольку они имеют максимальные значениястолбцов в наборе данных.Есть мысли?

Ответы [ 3 ]

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

Более многословно, но удобно для tidyverse:

df %>% 
  #tidying
    mutate(id = row_number()) %>% 
    gather(name, amount, -id) %>% 
    group_by(id) %>%  arrange(id, desc(amount)) %>% 
  #workhorse
    mutate(top.value = head(name, 1) ) %>% 
  #Pivot
    spread(name, amount)

   # A tibble: 10 x 5
# Groups:   id [10]
      id top.value     bob   dick    sam
   <int> <chr>       <dbl>  <dbl>  <dbl>
 1     1 sam       -0.560  -1.07   1.22 
 2     2 sam       -0.230  -0.218  0.360
 3     3 bob        1.56   -1.03   0.401
 4     4 sam        0.0705 -0.729  0.111
 5     5 bob        0.129  -0.625 -0.556
 6     6 sam        1.72   -1.69   1.79 
 7     7 dick       0.461   0.838  0.498
 8     8 dick      -1.27    0.153 -1.97 
 9     9 sam       -0.687  -1.14   0.701
10    10 dick      -0.446   1.25  -0.473

Если вы не хотите использовать аккуратные данные, попробуйте:

df %>% 
  mutate(max.name = names(.)[max.col(.)]  )
0 голосов
/ 01 октября 2018

a data.table версия для тех, кто приземлится в этом вопросе и ищет альтернативу data.table:

require(data.table)
setDT(df)
df[, m := names(df)[apply(.SD, 1, which.max)]]
0 голосов
/ 29 сентября 2018

Это будет хорошо работать:

df$result = names(df)[apply(df, 1, which.max)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...