Reputation: 1372
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
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