提取多个不同长度的字符串

Extracting a number of a string of varying lengths

假设我有一个向量:

testVector <- c("I have 10 cars", "6 cars", "You have 4 cars", "15 cars")

有没有办法解析这个向量,这样我就可以只存储数值:

10, 6, 4, 15

如果问题只是“15 辆汽车”和“6 辆汽车”,我知道如何解析它,但我也很难处理前面有文本的字符串!任何帮助是极大的赞赏。

我们可以将str_extract与模式\d+一起使用,这意味着匹配一个或多个数字。也可以写成[0-9]+.

library(stringr)
as.numeric(str_extract(testVector, "\d+"))
#[1] 10  6  4 15

如果一个字符串中有多个数字,我们使用str_extract_all which will1 return a list output.


这也可以用 base R 完成(不使用外部包)

as.numeric(regmatches(testVector, regexpr("\d+", testVector)))
#[1] 10  6  4 15

或使用 gsub 来自 base R

as.numeric(gsub("\D+", "", testVector))
#[1] 10  6  4 15

顺便说一句,一些函数只是使用 gsub,来自 extract_numeric

function (x) 
 {
   as.numeric(gsub("[^0-9.-]+", "", as.character(x)))
 }

所以,如果我们需要一个函数,我们可以创建一个(不使用任何外部包)

ext_num <- function(x) {
             as.numeric(gsub("\D+", "", x))
         }
ext_num(testVector)
#[1] 10  6  4 15

对于这个特殊的常见任务,tidyr 中有一个很好的辅助函数,叫做 extract_numeric:

library(tidyr)

extract_numeric(testVector)
## [1] 10  6  4 15

这或许也能派上用场。

testVector <- gsub("[:A-z:]","",testVector)
testVector <- gsub(" ","",testVector)

> testVector
[1] "10" "6"  "4"  "15"