How to perform arithmetic on values and operators expressed as strings?

后端 未结 2 680
野的像风
野的像风 2020-12-04 00:17

I have a character variable with ratios (proportions) expressed as strings:

x <- c(\"2/3\", \"5/6\", \"3/11\").

I want to conver

相关标签:
2条回答
  • 2020-12-04 00:56

    Here are some alternatives:

    1) read.table Read the text in as if it were a file and then divide:

    with(read.table(text = x, sep = "/"), 100 * V1 / V2)
    ## [1] 66.66667 83.33333 27.27273
    

    2) eval/parse eval/parse is generally frowned upon but here is how it would work:

    100 * sapply(as.list(parse(text = x)), eval)
    ## [1] 66.66667 83.33333 27.27273
    

    3) strsplit

    sapply(strsplit(x, "/"), function(x) { x <- as.numeric(x); 100 * x[1] / x[2]})
    ## [1] 66.66667 83.33333 27.27273
    

    4) gsubfn::strapply This picks out the two strings of digits using strapply and then converts each to numeric and divides:

    library(gsubfn)
    
    strapply(x, "(\\d+)/(\\d+)", ~ 100 * as.numeric(x) / as.numeric(y), simplify = TRUE)
    ## [1] 66.66667 83.33333 27.27273
    
    0 讨论(0)
  • 2020-12-04 01:02

    tidyerse

    If you stumbled onto this post in search of a tidyverse answer here is a simple extension. Note this does use the aforementioned "frowned upon" eval( parse())

    library(dplyr)
    library(purrr)
    
    # add into a tibble
    df <- tibble(fractions = c("2/3", "5/6", "3/11"))
    df %>% 
      mutate(numbers = map_dbl(fractions, ~eval(parse(text = .x))))
    #> # A tibble: 3 x 2
    #>   fractions numbers
    #>   <chr>       <dbl>
    #> 1 2/3         0.667
    #> 2 5/6         0.833
    #> 3 3/11        0.273
    
    0 讨论(0)
提交回复
热议问题