代码之家  ›  专栏  ›  技术社区  ›  elliot

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

  •  0
  • elliot  · 技术社区  · 6 年前

    我有一个大型数据库,它有一系列带有数字的列。我想用 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 回复  |  直到 6 年前
        1
  •  6
  •   Gregor Thomas    6 年前

    这很好:

    df$result = names(df)[apply(df, 1, which.max)]
    
        2
  •  3
  •   Nettle    6 年前

    更冗长,但整洁友好:

    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(.)]  )
    
        3
  •  2
  •   PavoDive    6 年前

    data.table

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