Ujjawal Bhandari
Ujjawal Bhandari

Reputation: 1372

Sort column names by month and year

I need to sort column names of dataframe by month and year. Sort should be in ascending order (oldest month and year first and recent month and year should appear at end.) First 3 columns of the dataframe shown below should be kept as it.

asd <- structure(list(Company = "Reliance Industries Limited", Symbol = "RELIANCE", 
               Var.1 = "Sales +", Mar.2018 = "116,915", Jun.2018 = "128,756", 
               Sep.2018 = "143,323", Dec.2018 = "156,898", Mar.2019 = "139,590", 
               Jun.2019 = "157,980", Sep.2019 = "149,302", Dec.2019 = "153,302", 
               Mar.2020 = "136,492", Jun.2020 = "88,253", Sep.2020 = "111,236", 
               Dec.2020 = "117,860", Mar.2017 = NA_character_, Dec.2017 = NA_character_, 
               Mar.2015 = NA_character_, Mar.2008 = NA_character_, Jun.2008 = NA_character_, 
               Mar.2010 = NA_character_, Jun.2012 = NA_character_, Mar.2009 = NA_character_, 
               Dec.2011 = NA_character_, Dec.2008 = NA_character_, Dec.2005 = NA_character_, 
               Dec.2006 = NA_character_, Jun.2010 = NA_character_, Jun.2011 = NA_character_, 
               Mar.2016 = NA_character_, Mar.2007 = NA_character_, Sep.2005 = NA_character_, 
               Sep.2008 = NA_character_, Jun.2009 = NA_character_, Sep.2009 = NA_character_, 
               Sep.2012 = NA_character_, Dec.2012 = NA_character_, Mar.2013 = NA_character_, 
               Jun.2013 = NA_character_, Sep.2013 = NA_character_, Dec.2013 = NA_character_, 
               Mar.2014 = NA_character_, Jun.2014 = NA_character_, Sep.2014 = NA_character_, 
               Dec.2014 = NA_character_, Jun.2005 = NA_character_, Sep.2017 = NA_character_, 
               Sep.2007 = NA_character_, Dec.2015 = NA_character_, Jun.2007 = NA_character_, 
               Dec.2009 = NA_character_, Mar.2012 = NA_character_, Dec.2016 = NA_character_, 
               Mar.2011 = NA_character_, Jun.2015 = NA_character_, Sep.2015 = NA_character_, 
               Jun.2016 = NA_character_, Sep.2016 = NA_character_, Jun.2017 = NA_character_, 
               Sep.2010 = NA_character_, Dec.2010 = NA_character_), row.names = 1L, class = "data.frame")

Upvotes: 1

Views: 333

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388982

Convert the column names to date object which you can easily order.

constant_cols <- 1:3
cols_to_sort <- names(asd)[-constant_cols]

cbind(asd[constant_cols], 
      asd[cols_to_sort[order(as.Date(paste0(cols_to_sort, '.01'), '%b.%Y.%d'))]])

This could be made a little shorter using zoo::as.yearmon.

cbind(asd[constant_cols], 
      asd[cols_to_sort[order(zoo::as.yearmon(cols_to_sort, '%b.%Y'))]])

Upvotes: 3

Related Questions