I have a character
variable with ratios (proportions) expressed as strings:
x <- c(\"2/3\", \"5/6\", \"3/11\")
.
I want to conver
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
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