Seyma Kalay
Seyma Kalay

Reputation: 2859

make a dataframe base on the which.max()

I have a data-set like

title <- c('Title.1','Title.2','Title.3')
year.15 <- c( 17,20,11)
year.16 <- c( 19,16,13)
year.17 <- c( 13,12,0)
year.18 <- c( 12,12,0)

df <- data.frame(title, year.15,year.16,year.17,year.18)
df

and I want to create a dataset base on the max value in that column, so the expected data frame should look like below

year.15  Title.2  20
year.16  Title.1  19
year.17  Title.1  13
year.18  Title.1  12
year.18  Title.1  12

many thanks in advance,

Upvotes: 1

Views: 45

Answers (2)

tmfmnk
tmfmnk

Reputation: 39858

Obe dplyr and tidyr possibility could be:

df %>%
 pivot_longer(-title) %>%
 group_by(name) %>%
 top_n(1, wt = value)

  title   name    value
  <fct>   <chr>   <dbl>
1 Title.1 year.16    19
2 Title.1 year.17    13
3 Title.1 year.18    12
4 Title.2 year.15    20
5 Title.2 year.18    12

Upvotes: 1

Edward
Edward

Reputation: 18543

library(tidyr)

df %>%
   pivot_longer(cols=-1) %>%
   group_by(name) %>%
   filter(value==max(value)) %>%
   arrange(name, title) %>%
   select(name, title, value)
# A tibble: 5 x 3
# Groups:   name [4]
  name    title   value
  <chr>   <fct>   <dbl>
1 year.15 Title.2    20
2 year.16 Title.1    19
3 year.17 Title.1    13
4 year.18 Title.1    12
5 year.18 Title.2    12

Upvotes: 2

Related Questions