让我们假设你有一个字符串:
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并不是那么好,所以如果你能提供帮助,我会很感激。另外,我不想假设字符串总是一样的,所以我想在第一个数字的位置之前删除所有单词(和任何特殊字符)。
答案 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
的新列中。