0

I have dataframe with 223 columns.

dput(colnames(a6))
c("d.54", "PRODUCT", "POS", "d.53", "d.52", "d.51", "d.50", "d.49", 
"d.48", "d.47", "d.46", "d.45", "d.44", "d.43", "d.42", "d.41", 
"d.40", "d.39", "d.38", "d.37", "d.36", "d.35", "d.34", "d.33", 
"d.32", "d.31", "d.30", "d.29", "d.28", "d.27", "d.26", "d.25", 
"d.24", "d.23", "d.22", "d.21", "d.20", "d.19", "d.18", "d.17", 
"d.16", "d.15", "d.14", "d.13", "d.12", "d.11", "d.10", "d.9", 
"d.8", "d.7", "d.6", "d.5", "d.4", "d.3", "d.2", "d.1", "d", 
"agr", "n", "s", "n.1", "s.1", "n.2", "s.2", "n.3", "s.3", "n.4", 
"s.4", "n.5", "s.5", "n.6", "s.6", "n.7", "s.7", "n.8", "s.8", 
"n.9", "s.9", "n.10", "s.10", "n.11", "s.11", "n.12", "s.12", 
"n.13", "s.13", "n.14", "s.14", "n.15", "s.15", "n.16", "s.16", 
"n.17", "s.17", "n.18", "s.18", "n.19", "s.19", "n.20", "s.20", 
"n.21", "s.21", "n.22", "s.22", "n.23", "s.23", "n.24", "s.24", 
"n.25", "s.25", "n.26", "s.26", "n.27", "s.27", "n.28", "s.28", 
"n.29", "s.29", "n.30", "s.30", "n.31", "s.31", "n.32", "s.32", 
"n.33", "s.33", "n.34", "s.34", "n.35", "s.35", "n.36", "s.36", 
"n.37", "s.37", "n.38", "s.38", "n.39", "s.39", "n.40", "s.40", 
"n.41", "s.41", "n.42", "s.42", "n.43", "s.43", "n.44", "s.44", 
"n.45", "s.45", "n.46", "s.46", "n.47", "s.47", "n.48", "s.48", 
"n.49", "s.49", "n.50", "s.50", "n.51", "s.51", "n.52", "s.52", 
"n.53", "s.53", "n.54", "s.54", "r.0", "r.1", "r.2", "r.3", "r.4", 
"r.5", "r.6", "r.7", "r.8", "r.9", "r.10", "r.11", "r.12", "r.13", 
"r.14", "r.15", "r.16", "r.17", "r.18", "r.19", "r.20", "r.21", 
"r.22", "r.23", "r.24", "r.25", "r.26", "r.27", "r.28", "r.29", 
"r.30", "r.31", "r.32", "r.33", "r.34", "r.35", "r.36", "r.37", 
"r.38", "r.39", "r.40", "r.41", "r.42", "r.43", "r.44", "r.45", 
"r.46", "r.47", "r.48", "r.49", "r.50", "r.51", "r.52", "r.53", 
"r.54") 

I try to reorder columns in such way

agr d d.1 d.2 --d.54 .... 

sort by 1 char then sort by number in each group. I try a7=a6[,order(colnames(a6))] but it sort it like char only and a get such result

colnames(a7)
  [1] "agr"     "d"       "d.1"     "d.10"    "d.11"    "d.12"    "d.13"    "d.14"    "d.15"    "d.16"    "d.17"   
 [12] "d.18"    "d.19"    "d.2"     "d.20"    "d.21"

Think there is simply answer on such question, but i cant find it...

Jaap
  • 81,064
  • 34
  • 182
  • 193
Batanichek
  • 7,761
  • 31
  • 49

2 Answers2

5

You can use mixedorder from library(gtools)

  library(gtools)
  a6[mixedorder(nm1)]

  head(nm1[mixedorder(nm1)])
  #[1] "agr" "d"   "d.1" "d.2" "d.3" "d.4"

Using another example

  set.seed(24)
  v1 <- sample(paste0(letters[1:4], '.', 1:20))
  mixedsort(v1)
  #[1] "a.1"  "a.5"  "a.9"  "a.13" "a.17" "b.2"  "b.6"  "b.10" "b.14" "b.18"
  #[11] "c.3"  "c.7"  "c.11" "c.15" "c.19" "d.4"  "d.8"  "d.12" "d.16" "d.20"

data

 nm1 <- colnames(a6)
Community
  • 1
  • 1
akrun
  • 874,273
  • 37
  • 540
  • 662
  • Sorry but when i use `nm1 <- colnames(a6) head(nm1[mixedorder(nm1)])` i get `head(nm1[mixedorder(nm1)]) [1] "agr" "d.10" "d.1" "d.11" "d.12" "d.13"` ( d.10 before d.1). May be i forget somethink – Batanichek Jul 27 '15 at 07:22
  • @Batanichek I was using only your dput output. – akrun Jul 27 '15 at 07:24
  • hmm .. strange.. maybe problem in "." ? in my R it's decimal mark and sort `.1` and others as numeric less than 1? – Batanichek Jul 27 '15 at 07:27
  • @Batanichek Is there any chance that the `mixedorder` function is masked by some other function? Try `nm1[gtools::mixedorder(nm1)]` – akrun Jul 27 '15 at 07:27
  • @Batanichek I updated with another example and it is working fine for me. – akrun Jul 27 '15 at 07:28
  • but not for me =( `set.seed(24) v1 <- sample(paste0(letters[1:4], '.', 1:20)) mixedsort(v1) [1] "a.1" "a.13" "a.17" "a.5" "a.9" "b.10" "b.14" "b.18" "b.2" "b.6" "c.11" "c.15" "c.19" "c.3" "c.7" "d.12" [17] "d.16" "d.20" "d.4" "d.8"` – Batanichek Jul 27 '15 at 07:30
  • @Batanichek I am using `gtools_3.4.2` and `R 3.2.1` – akrun Jul 27 '15 at 07:33
  • Thanks for help , i think priblem somewhere in my R options. bgoldst answer work well for me – Batanichek Jul 27 '15 at 07:39
  • @Batanichek Have you tried on a fresh R session? – akrun Jul 27 '15 at 07:40
  • @Batanichek I was trying to provide an already existing function instead of reinventing a new one. – akrun Jul 27 '15 at 07:41
  • i understand that mixorder its more general and usable answer, but it snot work with my colnames( dont know why). R -3.2.0 gtools 3.5.0 tried in fresh session -- same result – Batanichek Jul 27 '15 at 07:43
  • @Batanichek I don't know what might be the problem with `gtools3.5.0` – akrun Jul 27 '15 at 09:17
2
a6 <- setNames(do.call(data.frame,as.list(1:223)),c("d.54","PRODUCT","POS","d.53","d.52","d.51","d.50","d.49","d.48","d.47","d.46","d.45","d.44","d.43","d.42","d.41","d.40","d.39","d.38","d.37","d.36","d.35","d.34","d.33","d.32","d.31","d.30","d.29","d.28","d.27","d.26","d.25","d.24","d.23","d.22","d.21","d.20","d.19","d.18","d.17","d.16","d.15","d.14","d.13","d.12","d.11","d.10","d.9","d.8","d.7","d.6","d.5","d.4","d.3","d.2","d.1","d","agr","n","s","n.1","s.1","n.2","s.2","n.3","s.3","n.4","s.4","n.5","s.5","n.6","s.6","n.7","s.7","n.8","s.8","n.9","s.9","n.10","s.10","n.11","s.11","n.12","s.12","n.13","s.13","n.14","s.14","n.15","s.15","n.16","s.16","n.17","s.17","n.18","s.18","n.19","s.19","n.20","s.20","n.21","s.21","n.22","s.22","n.23","s.23","n.24","s.24","n.25","s.25","n.26","s.26","n.27","s.27","n.28","s.28","n.29","s.29","n.30","s.30","n.31","s.31","n.32","s.32","n.33","s.33","n.34","s.34","n.35","s.35","n.36","s.36","n.37","s.37","n.38","s.38","n.39","s.39","n.40","s.40","n.41","s.41","n.42","s.42","n.43","s.43","n.44","s.44","n.45","s.45","n.46","s.46","n.47","s.47","n.48","s.48","n.49","s.49","n.50","s.50","n.51","s.51","n.52","s.52","n.53","s.53","n.54","s.54","r.0","r.1","r.2","r.3","r.4","r.5","r.6","r.7","r.8","r.9","r.10","r.11","r.12","r.13","r.14","r.15","r.16","r.17","r.18","r.19","r.20","r.21","r.22","r.23","r.24","r.25","r.26","r.27","r.28","r.29","r.30","r.31","r.32","r.33","r.34","r.35","r.36","r.37","r.38","r.39","r.40","r.41","r.42","r.43","r.44","r.45","r.46","r.47","r.48","r.49","r.50","r.51","r.52","r.53","r.54"));
names(a6)[do.call(order,c(read.table(text=names(a6),sep='.',fill=T),na.last=F))];
##   [1] "agr"     "d"       "d.1"     "d.2"     "d.3"     "d.4"     "d.5"
##   [8] "d.6"     "d.7"     "d.8"     "d.9"     "d.10"    "d.11"    "d.12"
##  [15] "d.13"    "d.14"    "d.15"    "d.16"    "d.17"    "d.18"    "d.19"
##  [22] "d.20"    "d.21"    "d.22"    "d.23"    "d.24"    "d.25"    "d.26"
##  [29] "d.27"    "d.28"    "d.29"    "d.30"    "d.31"    "d.32"    "d.33"
##  [36] "d.34"    "d.35"    "d.36"    "d.37"    "d.38"    "d.39"    "d.40"
##  [43] "d.41"    "d.42"    "d.43"    "d.44"    "d.45"    "d.46"    "d.47"
##  [50] "d.48"    "d.49"    "d.50"    "d.51"    "d.52"    "d.53"    "d.54"
##  [57] "n"       "n.1"     "n.2"     "n.3"     "n.4"     "n.5"     "n.6"
##  [64] "n.7"     "n.8"     "n.9"     "n.10"    "n.11"    "n.12"    "n.13"
##  [71] "n.14"    "n.15"    "n.16"    "n.17"    "n.18"    "n.19"    "n.20"
##  [78] "n.21"    "n.22"    "n.23"    "n.24"    "n.25"    "n.26"    "n.27"
##  [85] "n.28"    "n.29"    "n.30"    "n.31"    "n.32"    "n.33"    "n.34"
##  [92] "n.35"    "n.36"    "n.37"    "n.38"    "n.39"    "n.40"    "n.41"
##  [99] "n.42"    "n.43"    "n.44"    "n.45"    "n.46"    "n.47"    "n.48"
## [106] "n.49"    "n.50"    "n.51"    "n.52"    "n.53"    "n.54"    "POS"
## [113] "PRODUCT" "r.0"     "r.1"     "r.2"     "r.3"     "r.4"     "r.5"
## [120] "r.6"     "r.7"     "r.8"     "r.9"     "r.10"    "r.11"    "r.12"
## [127] "r.13"    "r.14"    "r.15"    "r.16"    "r.17"    "r.18"    "r.19"
## [134] "r.20"    "r.21"    "r.22"    "r.23"    "r.24"    "r.25"    "r.26"
## [141] "r.27"    "r.28"    "r.29"    "r.30"    "r.31"    "r.32"    "r.33"
## [148] "r.34"    "r.35"    "r.36"    "r.37"    "r.38"    "r.39"    "r.40"
## [155] "r.41"    "r.42"    "r.43"    "r.44"    "r.45"    "r.46"    "r.47"
## [162] "r.48"    "r.49"    "r.50"    "r.51"    "r.52"    "r.53"    "r.54"
## [169] "s"       "s.1"     "s.2"     "s.3"     "s.4"     "s.5"     "s.6"
## [176] "s.7"     "s.8"     "s.9"     "s.10"    "s.11"    "s.12"    "s.13"
## [183] "s.14"    "s.15"    "s.16"    "s.17"    "s.18"    "s.19"    "s.20"
## [190] "s.21"    "s.22"    "s.23"    "s.24"    "s.25"    "s.26"    "s.27"
## [197] "s.28"    "s.29"    "s.30"    "s.31"    "s.32"    "s.33"    "s.34"
## [204] "s.35"    "s.36"    "s.37"    "s.38"    "s.39"    "s.40"    "s.41"
## [211] "s.42"    "s.43"    "s.44"    "s.45"    "s.46"    "s.47"    "s.48"
## [218] "s.49"    "s.50"    "s.51"    "s.52"    "s.53"    "s.54"
bgoldst
  • 34,190
  • 6
  • 38
  • 64