I have a dataset I need to sort: test.df<-data.frame(Zone=c("Floodplain", "Lake", "Shoreline"),Cover=c(50,60,70)) However, I don't want it sorted ascending/descending but in an order that I define via a vector: sort.v<-data.frame(c("Lake","Shoreline","Floodplain")) I realize I could probably just create the vector of [factors] in the order I want, then assign the value: sort.v$Cover<-test.df$Cover However, this is inefficient. Is there source code or a syntactical trick that will do the same more efficiently? Note: I have investigated order() and sort(), but neither seems to have an argument for defining the sorting order. Thanks in advance, Chipper -- View this message in context: http://r.789695.n4.nabble.com/Non-standard-sorts-on-vectors-tp2340431p2340431.html Sent from the R help mailing list archive at Nabble.com.
Hi Chipper, Try test.df[unlist(sort.v),] HTH, Jorge On Thu, Aug 26, 2010 at 5:59 PM, chipmaney <> wrote:> > I have a dataset I need to sort: > > test.df<-data.frame(Zone=c("Floodplain", "Lake", > "Shoreline"),Cover=c(50,60,70)) > > However, I don't want it sorted ascending/descending but in an order that I > define via a vector: > > sort.v<-data.frame(c("Lake","Shoreline","Floodplain")) > > I realize I could probably just create the vector of [factors] in the order > I want, then assign the value: > > sort.v$Cover<-test.df$Cover > > However, this is inefficient. Is there source code or a syntactical trick > that will do the same more efficiently? Note: I have investigated order() > and sort(), but neither seems to have an argument for defining the sorting > order. > > Thanks in advance, Chipper > > -- > View this message in context: > http://r.789695.n4.nabble.com/Non-standard-sorts-on-vectors-tp2340431p2340431.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Here's one possibility:> sort.v<-c(Lake=1,Shoreline=2,Floodplain=3) > test.df[order(sort.v[as.character(test.df$Zone)]),]Zone Cover 2 Lake 60 3 Shoreline 70 1 Floodplain 50 - Phil Spector Statistical Computing Facility Department of Statistics UC Berkeley spector at stat.berkeley.edu On Thu, 26 Aug 2010, chipmaney wrote:> > I have a dataset I need to sort: > > test.df<-data.frame(Zone=c("Floodplain", "Lake", > "Shoreline"),Cover=c(50,60,70)) > > However, I don't want it sorted ascending/descending but in an order that I > define via a vector: > > sort.v<-data.frame(c("Lake","Shoreline","Floodplain")) > > I realize I could probably just create the vector of [factors] in the order > I want, then assign the value: > > sort.v$Cover<-test.df$Cover > > However, this is inefficient. Is there source code or a syntactical trick > that will do the same more efficiently? Note: I have investigated order() > and sort(), but neither seems to have an argument for defining the sorting > order. > > Thanks in advance, Chipper > > -- > View this message in context: http://r.789695.n4.nabble.com/Non-standard-sorts-on-vectors-tp2340431p2340431.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of chipmaney > Sent: Thursday, August 26, 2010 3:00 PM > To: r-help at r-project.org > Subject: [R] Non-standard sorts on vectors > > > I have a dataset I need to sort: > > test.df<-data.frame(Zone=c("Floodplain", "Lake", > "Shoreline"),Cover=c(50,60,70)) > > However, I don't want it sorted ascending/descending but in > an order that I > define via a vector: > > sort.v<-data.frame(c("Lake","Shoreline","Floodplain")) > > I realize I could probably just create the vector of > [factors] in the order > I want, then assign the value: > > sort.v$Cover<-test.df$Cover > > However, this is inefficient.What is your measure of inefficiency? If you always want results in this order I would recommend you convert the Cover column to a factor with the levels in the order that you want. E.g.,> test.df <- data.frame(Zone=c("Floodplain","Lake","Floodplain","Shoreline","Lake","Shoreline"), Cover=c(45, 65, 49, 75, 67, 77), Year=c(1977, 1980, 1990, 1985, 1995, 2010))> test.df$Zone <- factor(test.df$Zone,levels=c("Lake","Shoreline","Floodplain"))> # that call to factor could have been in the original call to > # to data.frame(), but if you made the data.frame with read.table() > # then it is easiest to make the factors in a separate step. > test.dfZone Cover Year 1 Floodplain 45 1977 2 Lake 65 1980 3 Floodplain 49 1990 4 Shoreline 75 1985 5 Lake 67 1995 6 Shoreline 77 2010 Now it sorts the way you want and tables, model summaries, plots, and lots of other things will be in the order that you like: > test.df[order(test.df$Zone),] Zone Cover Year 2 Lake 65 1980 5 Lake 67 1995 4 Shoreline 75 1985 6 Shoreline 77 2010 1 Floodplain 45 1977 3 Floodplain 49 1990 > table(test.df$Zone) Lake Shoreline Floodplain 2 2 2 > lm(data=test.df, Cover ~ Zone - 1) Call: lm(formula = Cover ~ Zone - 1, data = test.df) Coefficients: ZoneLake ZoneShoreline ZoneFloodplain 66 76 47 > library(lattice) > xyplot(data=test.df, Cover ~ Year | Zone) Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> Is there source code or a > syntactical trick > that will do the same more efficiently? Note: I have > investigated order() > and sort(), but neither seems to have an argument for > defining the sorting > order. > > Thanks in advance, Chipper > > -- > View this message in context: > http://r.789695.n4.nabble.com/Non-standard-sorts-on-vectors-tp2340431p2340431.html> Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >