【问题标题】:How to perform arithmetic on values and operators expressed as strings?如何对表示为字符串的值和运算符执行算术运算?
【发布时间】:2016-03-17 23:29:13
【问题描述】:

我有一个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

怎么办?

【问题讨论】:

    标签: r


    【解决方案1】:

    这里有一些替代方案:

    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
    

    【讨论】:

    【解决方案2】:

    整洁

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

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 2013-09-06
      • 1970-01-01
      • 2014-02-17
      • 2013-02-19
      • 2017-04-06
      • 2020-04-17
      • 2012-09-12
      • 1970-01-01
      相关资源
      最近更新 更多