[R] as.ordered

Gavin Simpson gavin.simpson at ucl.ac.uk
Tue Oct 9 16:23:38 CEST 2007


Birgit,

First things first, stop trying to sort.list a data frame. This is why
you are getting the error. It is still a dataframe whether it has 1
column or 100. ?sort.list clearly says argument 'x' is a vector, and as
this shows, you are not passing it a vector

> dat0 <- data.frame(var1 = runif(10))
> class(dat0)
[1] "data.frame"
> sort.list(dat0)
Error in sort.list(dat0) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

This will work,

> sort.list(dat$var1)
 [1]  8  2  3 10  9  4  6  7  1  5

But returns the sorted *vector*, which is not what you want if I
understand you.

Secondly, sort is not the correct tool for this job (again, if I've
understood what you are trying to achieve). Consider this example with 3
variables and I want to order them on the first two columns only:

> dat <- data.frame(var1 = runif(10), var2 = runif(10), var3 =
runif(10))
> dat
        var1         var2      var3
1  0.6489870 0.0007092352 0.1577805
2  0.2248372 0.6350688518 0.5345221
3  0.3031260 0.9814894125 0.9830289
4  0.3512622 0.7134463033 0.3758332
5  0.9920157 0.0905250614 0.4813042
6  0.3578282 0.9150679281 0.3739445
7  0.4420517 0.2544773000 0.3243123
8  0.1610078 0.3951566671 0.5922013
9  0.3454540 0.7033491128 0.2121476
10 0.3224135 0.2658058712 0.9959194
> ord <- order(dat$var1, dat$var2)
> ## if you need ordering on more columns, just add
> ## then in the line above
> dat.ord <- dat[ord, ]
> dat.ord
        var1         var2      var3
8  0.1610078 0.3951566671 0.5922013
2  0.2248372 0.6350688518 0.5345221
3  0.3031260 0.9814894125 0.9830289
10 0.3224135 0.2658058712 0.9959194
9  0.3454540 0.7033491128 0.2121476
4  0.3512622 0.7134463033 0.3758332
6  0.3578282 0.9150679281 0.3739445
7  0.4420517 0.2544773000 0.3243123
1  0.6489870 0.0007092352 0.1577805
5  0.9920157 0.0905250614 0.4813042

Now I see that you have factors, so lets try that:

> dat.fac <- data.frame(fac1 = as.factor(sample(1:5, 10, replace = TRUE)), 
                        fac2 = as.factor(sample(1:10, 10, replace = TRUE)), 
                        fac3 = as.factor(sample(c(1,3,6,8), 10, replace = TRUE)))
> dat.fac
   fac1 fac2 fac3
1     5   10    8
2     2    9    6
3     4    9    6
4     5    4    3
5     4    1    8
6     4    1    1
7     5   10    8
8     3    8    8
9     3    2    6
10    4   10    6
> ord <- order(dat.fac$fac1, dat.fac$fac2) 
> ord  [1]  2  9  8  5  6  3 10  4  1  7
> dat.fac.ord <- dat.fac[ord, ] 
> dat.fac.ord    fac1 fac2 fac3
2     2    9    6
9     3    2    6
8     3    8    8
5     4    1    8
6     4    1    1
3     4    9    6
10    4   10    6
4     5    4    3
1     5   10    8
7     5   10    8

Read ?order, and see that it's first argument is ... and this is
supposed to be (quoting from ?order): 

Arguments:

     ...: a sequence of numeric, complex, character or logical vectors,
          all of the same length.

Hence why my example works - assuming that is what you wanted of course.

>From now on though I'm less clear what you actually need. Is what I did
above sufficient? If you need to convert the factors to be *ordered* in
the R sense, such that one level is treated higher or lower in value
than another, we need something else - perhaps in addition, which
applies as.ordered() to each element of the data frame in turn:

> ## continue with the ordered data frame of factors from above
> ## but now convert each factor to an ordered factor
> new.fac.ord <- data.frame(lapply(dat.fac.ord, as.ordered))
> new.fac.ord
   fac1 fac2 fac3
1     2    9    6
2     3    2    6
3     3    8    8
4     4    1    8
5     4    1    1
6     4    9    6
7     4   10    6
8     5    4    3
9     5   10    8
10    5   10    8
> str(new.fac.ord)
'data.frame':   10 obs. of  3 variables:
 $ fac1: Ord.factor w/ 4 levels "2"<"3"<"4"<"5": 1 2 2 3 3 3 3 4 4 4
 $ fac2: Ord.factor w/ 6 levels "1"<"2"<"4"<"8"<..: 5 2 4 1 1 5 6 3 6 6
 $ fac3: Ord.factor w/ 4 levels "1"<"3"<"6"<"8": 3 3 4 4 1 3 3 2 4 4

But I suspect this is not what you wanted as you use order() to achieve
partly a solution but ordering on a single variable.

HTH

G

On Tue, 2007-10-09 at 11:14 +0200, Birgit Lemcke wrote:
> Hello Friedrich,
> 
> thanks for your help and it is really not important that the solution  
> is elegant. Important is only that there is a solution.
> 
> But I still have some problems with this topic.
> 
> #I tried as you suggested to order the vectors separately. My first  
> problem is that my data is a data.frame:
> 
> data.frame':	348 obs. of  1 variable:
> $ bracts.length.relative.to.flower...............Min: Factor w/ 4  
> levels "1","2","3","4": 2 3 3 3 3 2 1 4 3 2 ...
> 
>      bracts.length.relative.to.flower...............Min
> 1                                                    2
> 2                                                    3
> 3                                                    3
> 4                                                    3
> 5                                                    3
> 6                                                    2
> 
> 
> #I tried to convert it to a vector using this:
> 
> bract.awnMin<-as.vector(bract.awnMin)
> 
> '#and then to use sort.list:
> 
> sort.list(bract.awnMin)
> Fehler in sort.list(bract.awnMin) :
>    'x' must be atomic for 'sort.list'
> Have you called 'sort' on a list?
> 
> #if I try to use the following for the data.frame with two variables,  
> it works well.
> 
> bract.awn[order(bract.awn[,1]),]
> 
> #but I have tu order both variables an therefore I should do that  
> separately and then use cbind.
> 
> Can somebody help me with my problem please?
> 
> Greetings
> 
> Birgit
> 
> 
> 
> 
> 
> 
> Am 08.10.2007 um 20:46 schrieb Friedrich Schuster:
> 
> >
> > Hello,
> >
> > (Warning. This might not be the most complete or elegant solution ...)
> >
> > If you want a sorted dataframe: look here for example
> > http://tolstoy.newcastle.edu.au/R/help/05/02/12391.html
> >
> > To convert the factors from a data frame, you have to call  
> > as.ordered for
> > each factor separately (not for the dataframe).
> > To convert  two factors a and b and merge them into a new dataframe:
> > newFrame <- as.data.frame(cbind(as.ordered(a),as.ordered(b)))
> > l
> > For a larger number of factors this can be done with a loop or  
> > better one of
> > the "apply"-functions.
> >
> > Hope this helps,
> > Friedrich Schuster
> >
> >
> > Birgit Lemcke wrote:
> >>
> >> Hello Members,
> >>
> >> I try to convert variables in a data.frame (bract.awn) in the class
> >> ordered.
> >>
> >> str(bract.awn)
> >> 'data.frame':	348 obs. of  2 variables:
> >> $ bracts.length.relative.to.flower...............Min: Factor w/ 4
> >> levels "1","2","3","4": 2 3 3 3 3 2 1 4 3 2 ...
> >> $ bract.awn.relative.to.body.................Max    : Factor w/ 4
> >> levels "1","2","3","4": 1 3 2 1 4 1 1 1 1 1
> >>
> >>
> >> I tried this:
> >>
> >> bract.awn<-as.ordered(bract.awn)
> >>
> >> Fehler in sort.list(unique.default(x), na.last = TRUE) :
> >>    'x' must be atomic for 'sort.list'
> >> Have you called 'sort' on a list?
> >>
> >> What am I doing wrong?
> >>
> >> Thanks a lot in advance.
> >>
> >> Regards
> >>
> >> Birgit
> >>
> >>
> >>
> >> Birgit Lemcke
> >> Institut für Systematische Botanik
> >> Zollikerstrasse 107
> >> CH-8008 Zürich
> >> Switzerland
> >> Ph: +41 (0)44 634 8351
> >> birgit.lemcke at systbot.uzh.ch
> >>
> >> ______________________________________________
> >> 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.
> >>
> >>
> >
> > -- 
> > View this message in context: http://www.nabble.com/as.ordered- 
> > tf4589454.html#a13102513
> > 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.
> 
> Birgit Lemcke
> Institut für Systematische Botanik
> Zollikerstrasse 107
> CH-8008 Zürich
> Switzerland
> Ph: +41 (0)44 634 8351
> birgit.lemcke at systbot.uzh.ch
> 
> ______________________________________________
> 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.
-- 
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
 Gavin Simpson                 [t] +44 (0)20 7679 0522
 ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
 Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
 Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
 UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%



More information about the R-help mailing list