[R] Strange behaviour of cbind

Marc Schwartz (via MN) mschwartz at mn.rr.com
Tue Jun 6 22:59:55 CEST 2006


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



More information about the R-help mailing list