# Re: [R] Strange behaviour of cbind

From: Marc Schwartz (via MN) <mschwartz_at_mn.rr.com>
Date: Wed 07 Jun 2006 - 06:59:55 EST

On Tue, 2006-06-06 at 13:44 -0700, Dirk Vandekerckhove wrote:
> Hi,
>
> Is this intended behaviour of cbind?
>
> > a<-c(0,1,2,3)
> > a
> [1] 0 1 2 3
> > a<-as.ordered(a)
> > a
> [1] 0 1 2 3
> Levels: 0 < 1 < 2 < 3
> > a<-a[a!=0] #remove the zero from a
> > a
> [1] 1 2 3
> Levels: 0 < 1 < 2 < 3
> > cbind(a)
> a
> [1,] 2
> [2,] 3
> [3,] 4
>
> #cbind adds +1 to each element

Does this help?

> a

[1] 1 2 3
Levels: 0 < 1 < 2 < 3

> as.integer(a)

[1] 2 3 4

Note in ?cbind, the Details section indicates:

"In the default method, all the vectors/matrices must be atomic (see vector) or lists (e.g., not expressions)."

For a factor, the atomic data type is the underlying integer vector. You eliminated '0' from the original ordered factor, which had an integer value of 1 (not 0!):

> a

[1] 0 1 2 3
Levels: 0 < 1 < 2 < 3

> as.integer(a)

[1] 1 2 3 4

Unless you re-level the factor (as you do below) the other elements retain the original integer values.

> > a<-as.ordered(as.vector(a))
> > a
> [1] 1 2 3
> Levels: 1 < 2 < 3
> > cbind(a)
> a
> [1,] 1
> [2,] 2
> [3,] 3
>
> #now it works...

Yep, you re-leveled 'a', so the integer values now correspond to the levels:

> a<-as.ordered(as.vector(a))

> a

[1] 1 2 3
Levels: 1 < 2 < 3

> as.integer(a)

[1] 1 2 3

HTH, Marc Schwartz

R-help@stat.math.ethz.ch mailing list