从R中的单个字符串中提取所有数字

时间:2012-10-04 12:48:09

标签: regex r

让我们假设你有一个字符串:

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

注意,数字以会计形式显示,因此负数出现在()之间。此外,您可以假设只有数字出现在数字首次出现的右侧。我对regexp并不是那么好,所以如果你能提供帮助,我会很感激。另外,我不想假设字符串总是一样的,所以我想在第一个数字的位置之前删除所有单词(和任何特殊字符)。

4 个答案:

答案 0 :(得分:34)

library(stringr)
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]]
> x
[1] "0"       "3,000"   "(500)"   "0"       "2.25"    "(1,200)"

将parens更改为底片:

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

然后as.numeric()taRifx::destring完成(destring的{​​{3}}默认支持否定,因此不需要keep选项):

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

OR:

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

答案 1 :(得分:19)

为了完整起见,这是基础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

答案 2 :(得分:1)

由于这是另一个问题,所以这是一个不受约束的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,.]+\\)?"
      )), "\\)$|,", ""
    ),
    "(", "-"
  )
)

答案 3 :(得分:0)

data frame(同一列中每行一个字符串)处理单个字符串时,我的工作正常如下:

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

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