[R] Convert character string to number

Marc Schwartz marc_schwartz at comcast.net
Sat Jun 21 17:25:42 CEST 2008


on 06/21/2008 09:18 AM Gabor Grothendieck wrote:
> On Sat, Jun 21, 2008 at 8:31 AM, Wacek Kusnierczyk
> <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no> wrote:
>> Hans-Jörg Bibiko wrote:
>>> On 21.06.2008, at 01:36, Ken Liu wrote:
>>>> I would like to convert a character vector
>>>>
>>>> xxx <- c("1/2", "1/4")
>>>>
>>>> to
>>>>
>>>> yyy <- c(0.5, 0.25)
>>>>
>>>>
>>>> , but as.numeric didn't work for me.  Could anyone give me a hint
>>>> please?
>>> There are many many ways, and they're depending on the structure of
>>> xxx. If you only have such fractions you can use this naïve approach:
>>>
>>> as.numeric( gsub("(\\d+)/(\\d+)", "\\1", xxx, perl=T) ) / as.numeric(
>>> gsub("(\\d+)/(\\d+)", "\\2", xxx, perl=T) )
>> or:
>>
>> library(gsubfn)
>> as.numeric(
>>    gsubfn("([0-9]+)/([0-9]+)",
>>    numerator+denominator~as.numeric(numerator)/as.numeric(denominator),
>>    xxx, backref=-2)
>> )
> 
> strapply, also in the gsubfn package, could be used here in a similar way too:
> 
>> library(gsubfn)
>> strapply(xxx, "([0-9]+)/([0-9]+)", ~ as.numeric(x) / as.numeric(y), backref = -2, simplify = c)
> [1] 0.50 0.25
> 
> or
> 
>> fn$sapply(strapply(xxx, "[0-9]+", as.numeric), ~ x[1]/x[2])
> [1] 0.50 0.25


I may have missed this one in the thread someplace, but I did not note 
any solutions based upon using strsplit(). So:

 > sapply(strsplit(xxx, split = "/"),
          function(x) as.numeric(x[1]) / as.numeric(x[2]))
[1] 0.50 0.25

or

 > apply(sapply(strsplit(xxx, split = "/"), as.numeric),
         2, function(x) x[1] / x[2])
[1] 0.50 0.25



HTH,

Marc Schwartz



More information about the R-help mailing list