[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