[regex] 문자열 벡터에서 숫자 추출

다음과 같은 문자열이 있습니다.

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

이 벡터의 숫자 만 grep하고 싶습니다. 예상 출력은 벡터입니다.

c(20, 1)

어떻게해야합니까?



답변

어때

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


답변

나는 대체가 해결책을 얻는 간접적 인 방법이라고 생각합니다. 모든 번호를 검색하려면 gregexpr다음을 권장합니다 .

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

문자열에 여러 개의 일치 항목이있는 경우 모두 가져옵니다. 첫 번째 일치에만 관심이있는 경우 regexpr대신 사용 gregexpr하고 unlist.


답변

업데이트
이후 extract_numeric사용되지 않습니다, 우리가 사용할 수 있습니다 parse_number에서 readr패키지로 제공된다.

library(readr)
parse_number(years)

여기에 또 다른 옵션이 있습니다. extract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1


답변

다음은 더 간단한 Perl과 유사한 정규식을 사용하는 Arun의 첫 번째 솔루션에 대한 대안입니다.

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))


답변

또는 간단히 :

as.numeric(gsub("\\D", "", years))
# [1] 20  1


답변

stringr파이프 라인 솔루션 :

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric


답변

모든 문자도 제거 할 수 있습니다.

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

그러나 이것은 덜 일반화 될 수 있습니다.