[R] Reorder data frame columns by negating list of names

Barry Rowlingson b.rowlingson at lancaster.ac.uk
Tue Feb 12 18:44:37 CET 2008


Thompson, David (MNR) wrote:
> Hello,
> 
> I would like to reorder columns in a data frame by their names as
> demonstrated below:
> 
> Take this data frame:
> 	> xxx <- data.frame(matrix(1:40, ncol=8))
> 	> names(xxx) <- letters[1:8]
> 	> xxx
> 	  a  b  c  d  e  f  g  h
> 	1 1  6 11 16 21 26 31 36
> 	2 2  7 12 17 22 27 32 37
> 	3 3  8 13 18 23 28 33 38
> 	4 4  9 14 19 24 29 34 39
> 	5 5 10 15 20 25 30 35 40
> 
> and reorder the columns like this:
> 	> xxx[,c( c('b', 'd', 'h'), c('a', 'c', 'e', 'f', 'g') )]
> 	   b  d  h a  c  e  f  g
> 	1  6 16 36 1 11 21 26 31
> 	2  7 17 37 2 12 22 27 32
> 	3  8 18 38 3 13 23 28 33
> 	4  9 19 39 4 14 24 29 34
> 	5 10 20 40 5 15 25 30 35
> 
> where I only have to name the columns that I'm interested in moving to
> the first few positions, something like:
> 	> xxx[,c( c('b', 'd', 'h'), -c('b', 'd', 'h') )]
> 	Error in -c("b", "d", "h") : invalid argument to unary operator
> 
> Suggestions? and Thank you, DaveT.

With:

 > move
[1] "b" "d" "h"

  you can do:

 > xxx[,c(match(move,names(xxx)),(1:dim(xxx)[2])[-match(move,names(xxx))])]

    b  d  h a  c  e  f  g
1  6 16 36 1 11 21 26 31
2  7 17 37 2 12 22 27 32
3  8 18 38 3 13 23 28 33
4  9 19 39 4 14 24 29 34
5 10 20 40 5 15 25 30 35

  It basically uses match() to convert names to column numbers. You cant 
mix positive and negative indices so you need to take the matches you've 
got away from the 1:dim(xxx)[2] and that gives you the leftover column 
numbers.

  Don't forget to add a comment.

Barry



More information about the R-help mailing list