评估字符串和空单元格

时间:2017-09-28 03:05:21

标签: r string split eval gsub

我有一个数据表,其中一列包含缺少的单元格和字符串,如7 1/4 INCHES1/4 INC9/16 INCH1 3/4 INCHES1 13/16 INCHES,{ {1}}。我想摆脱空格和INC / INCH / INCHES(字符串拆分)并通过将它们转换为数字20 INCHES来评估字符串的其余部分。

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)) 功能起作用。你能帮我解决一下吗? 其次,这个特殊代码似乎不是一种非常有效的方法。我有一个非常大的数据集,它有4列,有很多观察,如上面的小例子。我怎样才能把事情搞定一点?

修改

eval

我使用上面的行使其工作。但是,它仍然不是一种有效的方式。

1 个答案:

答案 0 :(得分:2)

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

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还显示了几种解决此类问题的方法