【问题标题】:Extract all numbers from a single string in R从R中的单个字符串中提取所有数字
【发布时间】:2012-10-04 12:48:08
【问题描述】:

假设你有一个字符串:

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)"

是否有一个函数可以将数字剥离到一个数组/向量中,从而产生以下所需的解决方案:

result <- c(0, 3000, -500, 0, 2.25, -1200)?

result[3] = -500

请注意,数字以会计形式显示,因此负数出现在 () 之间。此外,您可以假设只有数字出现在数字第一次出现的右侧。我对正则表达式不是很好,所以如果需要的话,如果你能提供帮助,我将不胜感激。另外,我不想假设字符串总是相同的,所以我希望去掉第一个数字位置之前的所有单词(和任何特殊字符)。

【问题讨论】:

    标签: regex r


    【解决方案1】:
    library(stringr)
    x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]]
    > x
    [1] "0"       "3,000"   "(500)"   "0"       "2.25"    "(1,200)"
    

    将括号改为负数:

    x <- gsub("\\((.+)\\)","-\\1",x)
    x
    [1] "0"      "3,000"  "-500"   "0"      "2.25"   "-1,200"
    

    然后as.numeric()taRifx::destring 完成(destringnext version 默认支持负数,因此不需要keep 选项):

    library(taRifx)
    destring( x, keep="0-9.-")
    [1]    0 3000  -500    0    2.25 -1200
    

    或者:

    as.numeric(gsub(",","",x))
    [1]     0  3000  -500     0     2.25 -1200
    

    【讨论】:

    • 嘿,您的第一个正则表达式中缺少句点。结果应该是 2.25,而不是 2 和 25。
    • 这太可怕了。你的正则表达式就像我想要的那样工作。我试过了,5 正则表达式没有带来独立于小数点符号 (., ,) 的值,你做。谢谢!
    【解决方案2】:

    为了完整起见,这是基本的 R 方式...

    x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine)))
    x <- as.numeric(gsub('\\(', '-', gsub(',', '', x)))
    [1]     0.00  3000.00  -500.00     0.00     2.25 -1200.00
    

    【讨论】:

    • 谢谢。两个答案都很简洁,也是我想要的。
    • 如果您知道所有数字都 > 0,则从第一行删除点和第二个逗号,例如,当列名编号为:col.1 col.2 col.3
    • 如果我想换一种方式怎么办。我有一个带有负值的数据框,我想用 () 替换它们。请帮忙
    • @ArunRaja 您的问题需要向 [r] 标签提交新问题。
    • @MatthewPlourde 你知道这个答案吗? stackoverflow.com/questions/29340345/…
    【解决方案3】:

    data frame(同一列中每行一个字符串)中处理单个字符串时,对我来说完美的工作如下:

    library(taRifx)
    DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-"))
    

    结果位于来自同一 data frame 的新列中。

    【讨论】:

      【解决方案4】:

      由于这出现在另一个问题中,这是一个没有拐杖的 stringi 解决方案(与 stringr 拐杖相比):

      as.numeric(
        stringi::stri_replace_first_fixed(
          stringi::stri_replace_all_regex(
            unlist(stringi::stri_match_all_regex(
              "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)", 
              "\\(?[0-9,.]+\\)?"
            )), "\\)$|,", ""
          ),
          "(", "-"
        )
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 2014-06-12
        • 2018-10-11
        相关资源
        最近更新 更多