【问题标题】:Evaluating character strings and empty cells评估字符串和空单元格
【发布时间】:2017-09-28 03:05:20
【问题描述】:

我有一个数据表,其中一列包含缺失的单元格和字符串,如7 1/4 INCHES1/4 INC9/16 INCH1 3/4 INCHES1 13/16 INCHES20 INCHES。我想去掉空格和 INC/INCH/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))

但是,我无法使 eval 函数正常工作。你能帮我一下吗? 其次,这个特定的代码似乎不是一种非常有效的方法。我有一个非常大的数据集,它有 4 列有很多观察结果,就像上面的小例子一样。我怎样才能把东西收紧一点?

编辑:

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

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

【问题讨论】:

    标签: r string split eval gsub


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!我只是专注于使用基本包,所以我没有检查 tidyverse。一个快速的问题:如何保存这个结果列?我想这是一个小标题。我对这类课程的经验不是很好。
    • @MustafaMuratARAT,将data %&gt;% 行更改为new_df &lt;- data %&gt;% ,结果将存储在new_df。要转换回标准数据框,您可以执行new_df &lt;- as.data.frame(new_df)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多