如何对表示为字符串的值和运算符执行算术运算?

时间:2016-03-17 23:29:13

标签: r

我有一个character变量,其比率(比例)表示为字符串:

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

我想将x中的字符值转换为百分比。因此,我想要的输出是:

c(2/3, 5/6, 3/11) * 100
# [1] 66.66667 83.33333 27.27273 

当我尝试as.numeric(x)时,会生成一条警告消息(由强制引入的NA)并且所有元素都转换为NA

怎么办?

2 个答案:

答案 0 :(得分:8)

以下是一些替代方案:

1)read.table 读取文本,就好像它是一个文件,然后除以:

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

2)eval / parse eval / parse通常不赞成,但以下是它的工作原理:

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 这会使用strapply选出两个数字字符串,然后将每个字符串转换为数字并分割:

library(gsubfn)

strapply(x, "(\\d+)/(\\d+)", ~ 100 * as.numeric(x) / as.numeric(y), simplify = TRUE)
## [1] 66.66667 83.33333 27.27273

答案 1 :(得分:0)

tidyerse

如果您偶然发现这篇文章以寻找一个整洁的答案,这里是一个简单的扩展。请注意,这确实使用了前面提到的“皱眉” 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