I have a following data frame
a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,\"X\",\"Y\",3))
> a
a b c
1 1 1 1
2 2 2 2
3 3
Assuming these are human chromosome names, chr1...chr22, chrX, chrY. We can convert them to numeric, then use order:
# convert to numeric
a$chromN <- as.integer(ifelse(a$c == "X", "23", ifelse(a$c == "Y", "24", a$c)))
# now sort as usual:
a[ order(a$chromN), ]
# a b c chromN
# 1 1 1 1 1
# 3 3 3 10 2
# 4 4 10 11 3
# 2 2 2 2 4
# 7 7 4 3 5
# 5 5 12 X 23
# 6 6 21 Y 24