

Rのデータフレームの中にx_1からx_17までカラムがあるのですが、それぞれの行に対してx_1からx_15までの中から最大の値と最大の値を持つカラムを抽出（x6が最大になる場合6を抽出）し、dplyr::mutateして新しい列に追加したいです。  
詳しい方、ご教示いただけますと幸いです。


CC BY-SA 4.0
2019-12-25T14:13:14.543
61768
2019-12-27T17:37:32.330
12457
question
r tidyverse
Rでデータフレームに対し横方向にmaxを取りたい


tidyverseでやるならこんな感じでしょうか。

[code]

    library(tidyverse)
    iris[-5] %>%
      mutate(rn = row_number()) %>%
      pivot_longer(-rn) %>%
      group_by(rn) %>%
      mutate(
        max_idx = which.max(value),
        max_val = max(value)
      ) %>%
      ungroup() %>%
      pivot_wider(names_from = name, values_from = value) %>%
      select(-rn)
    
[/code]


CC BY-SA 4.0
2019-12-25T23:35:34.917
61777
2019-12-25T23:35:34.917
31581
61768
answer


`purrr::pmap`, `base::pmax` でもいけます。

[code]

    library(tidyverse)
    
    # example data
    set.seed(1)
    N_COL <- 17
    N_ROW <- 8
    df_ <- runif(N_ROW * N_COL) %>%
      round(2) %>%
      matrix(N_ROW, N_COL) %>%
      as.data.frame() %>%
      set_names(str_c("X_", seq_len(MAX_COL))) 
    
    # procedure
    df_ %>%
      mutate(X_max = pmap(select(., X_1:X_15), ~ pmax(...)))
    
[/code]


CC BY-SA 4.0
2019-12-26T02:00:16.673
61782
2019-12-26T02:00:16.673
37209
61768
answer


<http://www.datasciencemadesimple.com/row-wise-operation-r-using-dplyr/>  
によると

[code]

    iris %>%
      rowwise() %>% mutate(row_max= max(Sepal.Length:Petal.Width))
    
[/code]

でいけるようですが、rowwiseは使用があまり推奨されていないとの頁もあるようです。  
<https://notchained.hatenablog.com/entry/2017/11/15/212117>  
その際は、回答してくださった方もいるように、purrrで対応するようです。


CC BY-SA 4.0
2019-12-27T17:37:32.330
61844
2019-12-27T17:37:32.330
12457
61768
answer