[R] don't want xtab sorting "numeric" factors...

Marc Schwartz MSchwartz at mn.rr.com
Tue Jun 7 04:07:17 CEST 2005


On Mon, 2005-06-06 at 16:54 -0700, Jeff D. Hamann wrote:
> r-gurus,
> 
> I couldn't find an answer to this and after an hour or so of trying all
> types or ways to do this, I've given up for now.
> 
> I'm having trouble getting the results from xtabs to generate
> "unsorted" factors. I've generated a sample data.frame I want to
> create a table from, using xtabs, and the results are presented below,
> 
> > temp
>    treatment itpa       qmd      tht
> 1          0  100  7.287263 3.362501
> 2         25  100 10.461070 4.118217
> 3         50  100 16.671731 5.814391
> 4         75  100 24.033238 8.264608
> 5        100  100 27.554497 9.586341
> 6          0  200  7.032527 3.355118
> 7         25  200  9.632828 4.039846
> 8         50  200 14.821584 5.659913
> 9         75  200 20.470692 7.791525
> 10       100  200 22.977827 8.901247
> 11         0  300  6.839360 3.355788
> 12        25  300  9.437649 4.070102
> 13        50  300 13.609004 5.545991
> 14        75  300 18.159601 7.387135
> 15       100  300 20.194335 8.380818
> 16         0  600  6.232509 3.330317
> 17        25  600  8.371084 3.990557
> 18        50  600 11.512385 5.235263
> 19        75  600 14.463214 6.605290
> 20       100  600 16.030137 7.467160
> 21         0  900  5.938640 3.338342
> 22        25  900  7.610695 3.891203
> 23        50  900 10.209530 4.917330
> 24        75  900 12.528651 6.157436
> 25       100  900 13.708622 6.791764
> 26         0 1200  5.841058 3.389716
> 27        25 1200  7.174748 3.859241
> 28        50 1200  9.238635 4.689011
> 29        75 1200 11.424713 5.688340
> 30       100 1200 12.349254 6.275864
> > t <- xtabs( temp$tht ~ temp$itpa + temp$treatment )
> 
> t <- xtabs( temp$tht ~ temp$itpa + temp$treatment )
> >
> > t
>          temp$treatment
> temp$itpa        0      100       25       50       75
>      100  3.362501 9.586341 4.118217 5.814391 8.264608
>      1200 3.389716 6.275864 3.859241 4.689011 5.688340
>      200  3.355118 8.901247 4.039846 5.659913 7.791525
>      300  3.355788 8.380818 4.070102 5.545991 7.387135
>      600  3.330317 7.467160 3.990557 5.235263 6.605290
>      900  3.338342 6.791764 3.891203 4.917330 6.157436
> >
> 
> the factors represent real values and shouldn't be sorted as
> strings. The table should read,
> 
> > t
>          temp$treatment
> temp$itpa        0       25       50       75      100
>      100  3.362501 4.118217 5.814391 8.264608 9.586341
>      200  3.355118 4.039846 5.659913 7.791525 8.901247
>      300  3.355788 4.070102 5.545991 7.387135 8.380818
>      600  3.330317 3.990557 5.235263 6.605290 7.467160
>      900  3.338342 3.891203 4.917330 6.157436 6.791764
>      1200 3.389716 3.859241 4.689011 5.688340 6.275864
> >
> 
> this wouldn't be that big of an issue if I only did this once for the
> results, but I'm using this in Sweave and need create the tables after
> thousands of iterations.
> 
> Any help would be greatly appreciated.
> 
> Thanks,
> Jeff.


Jeff,

Is 'itpa' supposed to be a factor?  

When using your data above, read into R using read.table, treatment and
itpa are integers and the others are doubles:

> str(temp)
`data.frame':   30 obs. of  4 variables:
 $ treatment: int  0 25 50 75 100 0 25 50 75 100 ...
 $ itpa     : int  100 100 100 100 100 200 200 200 200 200 ...
 $ qmd      : num   7.29 10.46 16.67 24.03 27.55 ...
 $ tht      : num  3.36 4.12 5.81 8.26 9.59 ...


In that case, I get:

> t <- xtabs(temp$tht ~ temp$itpa + temp$treatment)
> t
         temp$treatment
temp$itpa        0       25       50       75      100
     100  3.362501 4.118217 5.814391 8.264608 9.586341
     200  3.355118 4.039846 5.659913 7.791525 8.901247
     300  3.355788 4.070102 5.545991 7.387135 8.380818
     600  3.330317 3.990557 5.235263 6.605290 7.467160
     900  3.338342 3.891203 4.917330 6.157436 6.791764
     1200 3.389716 3.859241 4.689011 5.688340 6.275864


If I convert itpa to a factor with levels as you seem to have, I get:

> temp$itpa <- factor(as.character(temp$itpa))
> temp$itpa
 [1] 100  100  100  100  100  200  200  200  200  200  300  300  300
[14] 300  300  600  600  600  600  600  900  900  900  900  900  1200
[27] 1200 1200 1200 1200
Levels: 100 1200 200 300 600 900

> temp$itpa <- factor(as.character(temp$itpa))
> t <- xtabs( temp$tht ~ temp$itpa + temp$treatment)
> t
         temp$treatment
temp$itpa        0       25       50       75      100
     100  3.362501 4.118217 5.814391 8.264608 9.586341
     1200 3.389716 3.859241 4.689011 5.688340 6.275864
     200  3.355118 4.039846 5.659913 7.791525 8.901247
     300  3.355788 4.070102 5.545991 7.387135 8.380818
     600  3.330317 3.990557 5.235263 6.605290 7.467160
     900  3.338342 3.891203 4.917330 6.157436 6.791764


So it would seem that you either need to change itpa back to a numeric
value in the data frame:

> temp$itpa <- as.numeric(as.character(temp$itpa))
> t <- xtabs(temp$tht ~ temp$itpa + temp$treatment)
> t
         temp$treatment
temp$itpa        0       25       50       75      100
     100  3.362501 4.118217 5.814391 8.264608 9.586341
     200  3.355118 4.039846 5.659913 7.791525 8.901247
     300  3.355788 4.070102 5.545991 7.387135 8.380818
     600  3.330317 3.990557 5.235263 6.605290 7.467160
     900  3.338342 3.891203 4.917330 6.157436 6.791764
     1200 3.389716 3.859241 4.689011 5.688340 6.275864


OR


If you need itpa to be a factor, modify the factor levels, since they
are now ordered by the character values, not the numeric values:


> temp$itpa <- factor(temp$itpa, levels = c(100, 200, 300, 600, 900,
                                            1200))
> temp$itpa
 [1] 100  100  100  100  100  200  200  200  200  200  300  300  300
[14] 300  300  600  600  600  600  600  900  900  900  900  900  1200
[27] 1200 1200 1200 1200
Levels: 100 200 300 600 900 1200

> t <- xtabs(temp$tht ~ temp$itpa + temp$treatment)
> t
         temp$treatment
temp$itpa        0       25       50       75      100
     100  3.362501 4.118217 5.814391 8.264608 9.586341
     200  3.355118 4.039846 5.659913 7.791525 8.901247
     300  3.355788 4.070102 5.545991 7.387135 8.380818
     600  3.330317 3.990557 5.235263 6.605290 7.467160
     900  3.338342 3.891203 4.917330 6.157436 6.791764
     1200 3.389716 3.859241 4.689011 5.688340 6.275864



HTH,

Marc Schwartz




More information about the R-help mailing list