# Move a column in a data.frame, refering by column names # Author : Sylvain Mareschal # License : GPL 3 http://www.gnu.org/licenses/gpl.html # Update : 2013/05/13 11:58 moveColumn <- function(dataframe, name, after, before) { # Column order without target column name.i <- which(colnames(dataframe) == name) newOrder <- setdiff(1:ncol(dataframe), name.i) # Re-inject target index at target spot if(!missing(after)) { if(is.na(after)) { after.i <- ncol(dataframe) } else { after.i <- which(colnames(dataframe) == after) } newOrder <- c(newOrder[ newOrder <= after.i ], name.i, newOrder[ newOrder > after.i ]) if(length(after.i) != 1) stop("'after' does not refer to an unique existing column in 'dataframe'") if(!missing(before)) warning("'before' ignored as 'after' is provided") } else if(!missing(before)) { if(is.na(before)) { before.i <- 1L } else { before.i <- which(colnames(dataframe) == before) } newOrder <- c(newOrder[ newOrder < before.i ], name.i, newOrder[ newOrder >= before.i ]) if(length(before.i) != 1) stop("'before' does not refer to an unique existing column in 'dataframe'") } else stop("'after' or 'before' must be provide") # Apply new column order dataframe <- dataframe[, newOrder ] return(dataframe) }