21

假设你有一个字符串:

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)?

IE

result[3] = -500

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

4

4 回答 4

40
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完成(下一个版本destring默认支持底片,因此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
于 2012-10-04T13:00:58.993 回答
23

为了完整起见,这是基本的 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
于 2012-10-04T14:13:39.377 回答
1

data frame对我来说,在(同一列中每行一个字符串)中处理单个字符串时效果很好,如下所示:

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

结果在同一个新列中data frame

于 2017-04-07T21:40:34.480 回答
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,.]+\\)?"
      )), "\\)$|,", ""
    ),
    "(", "-"
  )
)
于 2018-12-03T18:09:32.573 回答