代码之家  ›  专栏  ›  技术社区  ›  ARAT

计算字符串和空单元格

  •  1
  • ARAT  · 技术社区  · 7 年前

    我有一个数据表,其中一列由缺失的单元格和字符串组成,如 7 1/4 INCHES , 1/4 INC 9/16 INCH , 1 3/4 INCHES , 1 13/16 INCHES , 20 INCHES . 我想去掉空格和INC/INCH/INCH(字符串拆分),并通过将它们转换为类似数字的值来计算字符串的其余部分 7+1/4=7.25 .

    library(data.table)
    data<-data.table(variable = c("", "", "7 1/4 INCHES", "1/4 INC", "9/16 INCH", "1 3/4 INCHES", "", "1 13/16 INCHES", "20 INCHES", "", ""))
    #Assigning 0s to empty cells
    data$variable[data$variable == "" ] = 0
    #Getting rid of INCH, INCHES and INCH
    data$variable<-gsub("[[:space:]][A-z]*$", "", data$variable)
    #Adding "+" instead of whitespace  (for summation), like 7+1/4 instead of 7 1/4
    data$variable<-gsub( " ", "+", data$variable)
    data$variable<-eval(parse(text=data$variable))
    

    eval 功能正常工作。你能帮我一下吗?

    编辑:

    data$variable<-sapply(data$variable, function(x) eval(parse(text=x)))
    

    我使用上面的线使其工作。然而,这仍然不是一种有效的方法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   markdly    7 年前

    一种方法是将字符串的每个部分提取到单独的变量中,然后使用这些变量来计算结果。

    library(tidyverse)
    
    data %>% 
      as_tibble() %>% 
      extract(variable, c("x"), "^(\\d+) ", remove = FALSE) %>%
      extract(variable, c("y", "z"), "(\\d+)/(\\d+)", remove = FALSE) %>%
      mutate_at(vars(x, y, z), as.numeric) %>%
      mutate(result = if_else(is.na(x), 0, x) + if_else(is.na(y / z), 0, y / z)) %>%
      select(variable, result)
    #> # A tibble: 11 x 2
    #>          variable  result
    #>             <chr>   <dbl>
    #>  1                 0.0000
    #>  2                 0.0000
    #>  3   7 1/4 INCHES  7.2500
    #>  4        1/4 INC  0.2500
    #>  5      9/16 INCH  0.5625
    #>  6   1 3/4 INCHES  1.7500
    #>  7                 0.0000
    #>  8 1 13/16 INCHES  1.8125
    #>  9      20 INCHES 20.0000
    #> 10                 0.0000
    #> 11                 0.0000
    

    answer 还展示了处理此类问题的几种方法