134

我有这样的字符串:

years<-c("20 years old", "1 years old")

我只想从这个向量中提取数字。预期输出是一个向量:

c(20, 1)

我该怎么做呢?

4

11 回答 11

105

怎么样

# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))

或者

# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))

或者

# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
于 2013-01-27T01:51:05.320 回答
97

更新 由于extract_numeric已弃用,我们可以parse_numberreadr包中使用。

library(readr)
parse_number(years)

这是另一种选择extract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1
于 2016-08-02T05:23:36.470 回答
70

我认为替代是解决问题的一种间接方式。如果您想检索所有数字,我建议gregexpr

matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))

如果您在一个字符串中有多个匹配项,这将获得所有匹配项。如果您只对第一场比赛感兴趣,请使用regexpr而不是,gregexpr您可以跳过unlist.

于 2013-01-27T04:31:15.833 回答
37

这是 Arun 的第一个解决方案的替代方案,具有更简单的类似 Perl 的正则表达式:

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))
于 2013-01-27T02:04:55.740 回答
32

或者简单地说:

as.numeric(gsub("\\D", "", years))
# [1] 20  1
于 2016-07-11T22:34:32.577 回答
24

stringr流水线解决方案:

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
于 2016-10-01T12:55:12.213 回答
18

你也可以去掉所有的字母:

as.numeric(gsub("[[:alpha:]]", "", years))

不过,这可能不太普遍。

于 2013-01-27T02:27:38.933 回答
15

我们也可以使用str_extractfromstringr

years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20  1

如果字符串中有多个数字并且我们想提取所有数字,我们可以使用str_extract_allwhich str_extractdistinct 返回所有的 macthes。

years<-c("20 years old and 21", "1 years old")
stringr::str_extract(years, "\\d+")
#[1] "20"  "1"

stringr::str_extract_all(years, "\\d+")

#[[1]]
#[1] "20" "21"

#[[2]]
#[1] "1"
于 2019-08-28T06:14:16.963 回答
7

从开始位置的任何字符串中提取数字。

x <- gregexpr("^[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))

从任何位置的字符串INDEPENDENT中提取数字。

x <- gregexpr("[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
于 2016-12-24T05:47:06.637 回答
4

使用unglue包我们可以做到:

# install.packages("unglue")
library(unglue)

years<-c("20 years old", "1 years old")
unglue_vec(years, "{x} years old", convert = TRUE)
#> [1] 20  1

reprex 包(v0.3.0)于 2019-11-06 创建

更多信息:https ://github.com/moodymudskipper/unglue/blob/master/README.md

于 2019-11-06T12:08:42.387 回答
3

Gabor Grothendieck 在 r-help 邮件列表中发帖之后

years<-c("20 years old", "1 years old")

library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
于 2016-04-27T19:50:45.277 回答