[R] type conversion

Marc Schwartz marc_schwartz at comcast.net
Wed Oct 17 22:16:34 CEST 2007


On Wed, 2007-10-17 at 17:20 -0230, Roger Mason wrote:
> Hello,
> 
> I am trying to do arithmetic on numbers extracted from a PostgreSQL
> database, wherein the numbers are stored as type "money".  The
> transcript below illustrates the problem.
> 
> > Membersind06 <- sqlQuery(channel,"select * from income where rowname like '%Membersind%'")         
> > names(Membersind06)
> [1] "rowname"  "item"     "budget07" "budget08" "actual06"
> > Membersind06$actual06
> [1] $149,625.00
> Levels: $149,625.00
> > typeof(Membersind06$actual06)
> [1] "integer"
> > Membersind06$actual06/10
> [1] NA
> Warning message:
> / not meaningful for factors in: Ops.factor(Membersind06$actual06, 10)
> 
> Can someone show me how to convert the quantity stored in
> Membersind06$actual06 to a numeric type such that I can perfor
> arithmetic operations on it?

The value is coming in as a factor:

> typeof("A")
[1] "character"

> typeof(factor("A"))
[1] "integer"

However, note:

> is.integer(factor("A"))
[1] FALSE


In this case, you will likely want to use gsub() to strip the '$' and
the ',' and then convert to numeric:

> as.numeric(gsub("[^0-9\\.]", "", "$149,625.00"))
[1] 149625


Note that the trailing 0's are not printed by default in R, since they
don't represent significant digits. Another example:

> as.numeric(gsub("[^0-9\\.]", "", "$149,625.23"))
[1] 149625.2

However:

> print(as.numeric(gsub("[^0-9\\.]", "", "$149,625.23")), 8)
[1] 149625.23

This has nothing to do with the way data is stored in R, only the way it
is displayed.

See ?options and review 'digits'.


So, for your data above:

Membersind06$actual06 <- as.numeric(gsub("[^0-9\\.]", "", 
                                    Membersind06$actual06))


See ?gsub and ?regex

HTH,

Marc Schwartz



More information about the R-help mailing list