我有一个数据表,其中一列包含缺少的单元格和字符串,如7 1/4 INCHES
,1/4 INC
,9/16 INCH
,1 3/4 INCHES
,1 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
我使用上面的行使其工作。但是,它仍然不是一种有效的方式。
答案 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还显示了几种解决此类问题的方法