Sometimes you need to explicitly convert factors to either text or numbers. To do this, you use the functions as.character() or as.numeric(). First, convert your directions vector into a factor called directions.factor (as you saw earlier):

> directions <- c("North", "East", "South", "South")
> directions.factor <- factor(directions)
> directions.factor
[1] North East South South
Levels: East North South

Use as.character() to convert a factor to a character vector:

> as.character(directions.factor)
[1] "North" "East" "South" "South"

Use as.numeric() to convert a factor to a numeric vector. Note that this will return the numeric codes that correspond to the factor levels. For example, "East" corresponds to 1, "North" corresponds to 2, and so forth:

> as.numeric(directions.factor)
[1] 2 1 3 3

Be very careful when you convert factors with numeric levels to a numeric vector. The results may not be what you expect.

For example, imagine you have a vector that indicates some test score results with the values c(9, 8, 10, 8, 9), which you convert to a factor:

> numbers <- factor(c(9, 8, 10, 8, 9))

To look at the internal representation of numbers, use str():

> str(numbers)
 Factor w/ 3 levels "8","9","10": 2 1 3 1 2

This indicates that R stores the values as c(2, 1, 3, 1, 2) with associated levels of c("8", "9", "10").


If you want to convert numbers to a character vector, the results are pretty much as you would expect:

> as.character(numbers)
[1] "9" "8" "10" "8" "9"

However, if you simply use as. numeric(), your result is a vector of the internal level representations of your factor and not the original values:

> as.numeric(numbers)
[1] 2 1 3 1 2

The R help at ?factor describes a solution to this problem. The solution is to index the levels by the factor itself, and then to convert to numeric:

> as.numeric(as.character(numbers))
[1] 9 8 10 8 9

This is an example of nested functions in R, in which you pass the results of one function to a second function. Nested functions are a bit like the Russian nesting dolls, where each toy is inside the next:

  • The inner function, as.character(numbers), contains the text c("8", "9", "10").

  • The outer function, as.numeric(...), does the final conversion to c(9, 8, 10, 8, 9).