# [R] sorting data in R

Kevin Wright kw.statr at gmail.com
Fri Apr 20 22:47:12 CEST 2007

```Now that "sort" is a generic function, I have modified my original
sort.data.frame function to be s 'data.frame' method to sort.  (You
now have to specify the formula as the 'by' argument).

See the R Wiki:
http://wiki.r-project.org/rwiki/doku.php?id=tips:data-frames:sort&s=sort%20data

There are also some other tips on that page for sorting.

Kevin Wright

>
> Hi
>
> Best function for sorting which i have used and many in the community :-)
> HTH Cheers
>
> sort.data.frame(Oats, ~ -nitro + Variety)
>
> Feedback and improvements are welcome.
>
> sort.data.frame <- function(form,dat){
>   # Author: Kevin Wright
>   # Some ideas from Andy Liaw
>   #   http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
>
>   # Use + for ascending, - for decending.
>   # Sorting is left to right in the formula
>
>   # Useage is either of the following:
>   # library(nlme); data(Oats)
>   # sort.data.frame(~-Variety+Block,Oats) # Note: levels(Oats\$Block)
>   # sort.data.frame(Oats,~nitro-Variety)
>
>   # If dat is the formula, then switch form and dat
>   if(inherits(dat,"formula")){
>     f=dat
>     dat=form
>     form=f
>   }
>   if(form[[1]] != "~")
>     stop("Formula must be one-sided.")
>
>   # Make the formula into character and remove spaces
>   formc <- as.character(form[2])
>   formc <- gsub(" ","",formc)
>   # If the first character is not + or -, add +
>   if(!is.element(substring(formc,1,1),c("+","-")))
>     formc <- paste("+",formc,sep="")
>
>   # Extract the variables from the formula
>   if(exists("is.R") && is.R()){
>     vars <- unlist(strsplit(formc, "[\\+\\-]"))
>   }
>   else{
>     vars <- unlist(lapply(unpaste(formc,"-"),unpaste,"+"))
>   }
>   vars <- vars[vars!=""] # Remove spurious "" terms
>
>   # Build a list of arguments to pass to "order" function
>   calllist <- list()
>   pos=1 # Position of + or -
>   for(i in 1:length(vars)){
>     varsign <- substring(formc,pos,pos)
>     pos <- pos+1+nchar(vars[i])
>     if(is.factor(dat[,vars[i]])){
>       if(varsign=="-")
>         calllist[[i]] <- -rank(dat[,vars[i]])
>       else
>         calllist[[i]] <- rank(dat[,vars[i]])
>     }
>     else {
>       if(varsign=="-")
>         calllist[[i]] <- -dat[,vars[i]]
>       else
>         calllist[[i]] <- dat[,vars[i]]
>     }
>   }
>   dat[do.call("order",calllist),]
>
> }
>
>
>
>
>
>
>
>
>
>
> elyakhlifi mustapha <elyakhlifi_mustapha at yahoo.fr>
> Sent by: r-help-bounces at stat.math.ethz.ch
> 20-04-07 03:30 PM
>
> To
> R-help at stat.math.ethz.ch
> cc
>
> Subject
> [R] sorting data in R
>
>
>
>
>
>
> hello,
> I'd  like  know how to sort a data frame in R for example how I should do
> to sort by Catholic with swiss data frame like below
> thanks
>
>              Fertility Agriculture Examination Education Catholic
> Infant.Mortality
> Courtelary        80.2        17.0          15        12     9.96    22.2
> Delemont          83.1        45.1           6         9    84.84    22.2
> Franches-Mnt      92.5        39.7           5         5    93.40    20.2
> Moutier           85.8        36.5          12         7    33.77    20.3
> Neuveville        76.9        43.5          17        15     5.16    20.6
> Porrentruy        76.1        35.3           9         7    90.57    26.6
> Broye             83.8        70.2          16         7    92.85    23.6
> Glane             92.4        67.8          14         8    97.16    24.9
> Gruyere           82.4        53.3          12         7    97.67    21.0
> Sarine            82.9        45.2          16        13    91.38    24.4
> Veveyse           87.1        64.5          14         6    98.61    24.5
> Aigle             64.1        62.0          21        12     8.52    16.5
> Aubonne           66.9        67.5          14         7     2.27    19.1
> Avenches          68.9        60.7          19        12     4.43    22.7
> Cossonay          61.7        69.3          22         5     2.82    18.7
> Echallens         68.3        72.6          18         2    24.20    21.2
> Grandson          71.7        34.0          17         8     3.30    20.0
> Lausanne          55.7        19.4          26        28    12.11    20.2
> La Vallee         54.3        15.2          31        20     2.15    10.8
> Lavaux            65.1        73.0          19         9     2.84    20.0
> Morges            65.5        59.8          22        10     5.23    18.0
> Moudon            65.0        55.1          14         3     4.52    22.4
> Nyone             56.6        50.9          22        12    15.14    16.7
> Orbe              57.4        54.1          20         6     4.20    15.3
> Oron              72.5        71.2          12         1     2.40    21.0
> Payerne           74.2        58.1          14         8     5.23    23.8
> Paysd'enhaut      72.0        63.5           6         3     2.56    18.0
> Rolle             60.5        60.8          16        10     7.72    16.3
> Vevey             58.3        26.8          25        19    18.46    20.9
> Yverdon           65.4        49.5          15         8     6.10    22.5
> Conthey           75.5        85.9           3         2    99.71    15.1
> Entremont         69.3        84.9           7         6    99.68    19.8
> Herens            77.3        89.7           5         2   100.00    18.3
> Martigwy          70.5        78.2          12         6    98.96    19.4
> Monthey           79.4        64.9           7         3    98.22    20.2
> St Maurice        65.0        75.9           9         9    99.06    17.8
> Sierre            92.2        84.6           3         3    99.46    16.3
> Sion              79.3        63.1          13        13    96.83    18.1
> Boudry            70.4        38.4          26        12     5.62    20.3
> La Chauxdfnd      65.7         7.7          29        11    13.79    20.5
> Le Locle          72.7        16.7          22        13    11.22    18.9
> Neuchatel         64.4        17.6          35        32    16.92    23.0
> Val de Ruz        77.6        37.6          15         7     4.97    20.0
> ValdeTravers      67.6        18.7          25         7     8.65    19.5
> V. De Geneve      35.0         1.2          37        53    42.34    18.0
> Rive Droite       44.7        46.6          16        29    50.43    18.2
> Rive Gauche       42.8        27.7          22        29    58.33    19.3
>
>
>
> ___________________________________________________________________________
>
> Découvrez une nouvelle façon d'obtenir des réponses à toutes vos questions
> !
> Profitez des connaissances, des opinions et des expériences des
> internautes sur Yahoo! Questions/Réponses
>
>                  [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>
>
> ============================================================================================
> DISCLAIMER AND CONFIDENTIALITY CAUTION:\ \ This message and ...{{dropped}}
>
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help