0

I have a data frame which looks like this :

a = c("1A","10A","11A","2B","2C","22C","3A","3B")
b= c(1,2,3,4,5,6,7,8)
ab = data.frame(a,b)

and I want to sort it according to the column a. I tried the mixed order

library(gtools)
ab[mixedorder(ab$a),]

but I don' t get the result I want (1A,2B,2C,3A,3B..). How can I fix this?

David Arenburg
  • 91,361
  • 17
  • 137
  • 196
geo_dd
  • 283
  • 1
  • 5
  • 22

2 Answers2

5

We need to convert to character class (as the 'a' column is factor based on the default option in data.frame call i.e. stringsAsFactors=TRUE)

ab[mixedorder(as.character(ab$a)),]
#    a b
#1  1A 1
#4  2B 4
#5  2C 5
#7  3A 7
#8  3B 8
#2 10A 2
#3 11A 3
#6 22C 6

Additional options are also explained in here

Community
  • 1
  • 1
akrun
  • 874,273
  • 37
  • 540
  • 662
4

I'd just split the column. If you want numeric order for the numbers part of the ID, you should probably have these numbers as a numeric column anyway.

ab$a1 <- as.numeric(gsub("[[:alpha:]+]", "", ab$a))
ab$a2 <- gsub("\\d+", "", ab$a)

ab[order(ab$a1, ab$a2),]
#    a b a1 a2
#1  1A 1  1  A
#4  2B 4  2  B
#5  2C 5  2  C
#7  3A 7  3  A
#8  3B 8  3  B
#2 10A 2 10  A
#3 11A 3 11  A
#6 22C 6 22  C
Roland
  • 127,288
  • 10
  • 191
  • 288