使用dplyr添加基于最大行值的新列?

时间:2018-09-29 19:36:41

标签: r dplyr mutate

我有一个大型数据库,其中包含一系列带有数字的列。我想使用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 :(得分:3)

这可以正常工作:

df$result = names(df)[apply(df, 1, which.max)]

答案 1 :(得分:2)

一个data.table版本,适合那些会在此问题中寻找数据表替代项的人:

require(data.table)
setDT(df)
df[, m := names(df)[apply(.SD, 1, which.max)]]

答案 2 :(得分:0)

更冗长,但对整洁友好:

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(.)]  )