2 views

edited

When I convert a factor to a numeric or integer, I get the underlying level codes, not the values as numbers.

f <- factor(sample(runif(5), 20, replace = TRUE))

##  [1] 0.0248644019011408 0.0248644019011408 0.179684827337041

##  [4] 0.0284090070053935 0.363644931698218  0.363644931698218

##  [7] 0.179684827337041  0.249704354675487  0.249704354675487

## [10] 0.0248644019011408 0.249704354675487  0.0284090070053935

## [13] 0.179684827337041  0.0248644019011408 0.179684827337041

## [16] 0.363644931698218  0.249704354675487  0.363644931698218

## [19] 0.179684827337041  0.0284090070053935

## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218

as.numeric(f)

##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

as.integer(f)

##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

I have to resort to pasting to get the real values:

as.numeric(paste(f))

##  [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493

##  [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901

## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493

## [19] 0.17968483 0.02840901

Is there a better way to convert a factor to numeric?

edited by

If you use as.numeric() directly on a factor, the result would be a vector of the internal level representations of the factor and not the original values.

So, to convert a factor to a numeric with its original values intact, you need to either:

• Index the levels by the factor itself, and then to convert to numeric
• Use a nested function as.numeric(as.character(factor))

For example:

f <- factor(sample(runif(5), 20, replace = TRUE))

num <- as.numeric(as.character(f))

num

Output:

[1] 0.4814881 0.4814881 0.8672543 0.1002661 0.8672543 0.1002661 0.3246189 0.4814881

[9] 0.7017931 0.1002661 0.3246189 0.8672543 0.3246189 0.3246189 0.8672543 0.8672543

[17] 0.8672543 0.3246189 0.4814881 0.3246189