【问题标题】:R string cleaningR 琴弦清洁
【发布时间】:2023-03-10 19:21:01
【问题描述】:

我正在处理一些非常混乱的字符串,如下所示

 Value
 -------------------
 25 
 32.12 .  (05- 
 33.90 ,
 46.70 ,
 () 26.60
 27.2  
 23.24 .  (12-
 36.52 ,
 27.1814404432133 [
 29.73 .  (22-
 31.8058003525076 [
 35.40 ,
 38.44 . 
 46.14 ,
 29.26 [
 25.44 .

我不确定如何有效地清理它,使其看起来像这样。

 Value
 -------------------
 25 
 32.12  
 33.90
 46.70
 26.60
 27.2  
 23.24
 36.52
 27.1814404432133
 29.73
 31.8058003525076
 35.40
 38.44
 46.14
 29.26
 25.44

我尝试使用子函数 sub(" .*", '', Value) 来捕获空格之前的所有内容,但这不起作用,因此寻找一些有关如何清理此字符串的建议或提示。

Value <- c(" 25 \n", "  32.12 .  (05-", "33.90 ,\n", "46.70 ,\n", " () 26.60 ", 
           " 27.2  ", "  23.24 .  (12-", "36.52 ,\n", " 27.1814404432133\n\n[", 
           "  29.73 .  (22-", " 31.8058003525076\n\n[", "35.40 ,\n", "  38.44 .\n", 
           "46.14 ,\n", " 29.26\n\n[", "  25.44 .\n")
df <- data.frame(Value) 

【问题讨论】:

    标签: r regex string gsub data-cleaning


    【解决方案1】:

    您可以使用提取第一个数字

    Value <- c(" 25 \n", "  32.12 .  (05-", "33.90 ,\n", "46.70 ,\n", " () 26.60 ", 
               " 27.2  ", "  23.24 .  (12-", "36.52 ,\n", " 27.1814404432133\n\n[", 
               "  29.73 .  (22-", " 31.8058003525076\n\n[", "35.40 ,\n", "  38.44 .\n", 
               "46.14 ,\n", " 29.26\n\n[", "  25.44 .\n")
    df <- data.frame(Value) 
    df$Value <- sub(".*?(\\d[0-9.]*).*", "\\1", df$Value)
    

    R demo online

    详情

    • .*? - 任何 0+ 个字符,尽可能少
    • (\\d[0-9.]*) - 第 1 组捕获任何数字 (\\d),然后是 0+ 数字或 . 符号
    • .* - 直到字符串末尾的任何 0+ 个字符。

    sub 函数执行单个替换,\1 反向引用保存捕获到组 1 中的值。

    如果您想确保只提取 digit(s) + ( . + digit(s) ) * 模式,您可以使用

    df$Value <- sub(".*?(\\d+(?:\\.\\d+)?).*", "\\1", df$Value)
    

    this R demo

    【讨论】:

    • 啊,我过去尝试过 sub(".*?(\[0-9.]*).*", "\\1", df$Value) 选项但错过了一些参数现在我知道缺少了什么。谢谢。
    【解决方案2】:

    你可以试试这个:

    library("stringr")
    
    str_extract(df$Value, "(\\d|\\.)+")
    

    【讨论】:

      【解决方案3】:

      我们可以从base R使用regmatches/regexpr

      as.numeric(regmatches(df$Value, regexpr("[0-9][0-9.]*", df$Value)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 2015-12-03
        • 2013-10-17
        相关资源
        最近更新 更多