我有一个字符串,例如"3.1 ml"
或"abc 3.1 xywazw"
我想从这个字符串中提取"3.1"
。我在堆栈溢出上发现了许多关于从字符串中提取数字的问题,但没有解决方案适用于十进制数的情况。
此方法使小数点和小数部分成为可选,并允许提取多个数字:
str <- " test 3.1 test 5"
as.numeric(unlist(regmatches(str,
gregexpr("[[:digit:]]+\.*[[:digit:]]*",str))
) )
#[1] 3.1 5.0
对负数的担忧可以通过可选的perl样式展望来解决:
str <- " test -4.5 3.1 test 5"
as.numeric(unlist(regmatches(str,gregexpr("(?>-)*[[:digit:]]+\.*[[:digit:]]*",str, perl=TRUE))))
#[1] -4.5 3.1 5.0
使用stringr
库:
x<-"abc 3.1 xywazw"
str_extract(x, "\d+\.*\d*")
[1] "3.1"
正则表达式,用于从 http://www.regular-expressions.info/floatingpoint.html 开始的浮点数,只需稍作调整即可在 R 中工作。
s <- "1e-6 dkel"
regmatches(s,gregexpr("[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?",s))
> [[1]]
> [1] "1e-6"
您可以使用正则表达式:
> str <- " test 3.1 test"
> as.numeric(regmatches(str,regexpr("[[:digit:]]+\.[[:digit:]]+",str)))
[1] 3.1
regexpr
返回匹配字符串的起始位置和长度。 regmatches
返回匹配项。然后,您可以将其转换为数字。
readr::parse_number(c("abc 3.1 xywazw", "-3.1 ml", "1,234.56"))
# [1] 3.10 -3.10 1234.56