다음과 같은 문자열이 있습니다.
years<-c("20 years old", "1 years old")
이 벡터의 숫자 만 grep하고 싶습니다. 예상 출력은 벡터입니다.
c(20, 1)
어떻게해야합니까?
다음과 같은 문자열이 있습니다.
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))
.*
전체 문자열과 일치해야하므로 필요합니다. 그것 없이는 아무것도 제거되지 않습니다. 또한 sub
여기에서 대신 사용할 수 있습니다 gsub
.
gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
결과 : [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
결과 : [1] "Jun. 27 –30 "
나는 대체가 해결책을 얻는 간접적 인 방법이라고 생각합니다. 모든 번호를 검색하려면 gregexpr
다음을 권장합니다 .
matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))
문자열에 여러 개의 일치 항목이있는 경우 모두 가져옵니다. 첫 번째 일치에만 관심이있는 경우 regexpr
대신 사용 gregexpr
하고 unlist
.
gregexpr
, regexpr
또는 둘 다?
gregexpr
. 나는 regexpr
지금까지 시도하지 않았다 . 엄청난 차이. Using regexpr
은 1e6 세트에서 Andrew와 Arun의 솔루션 (두 번째로 빠른) 사이에 배치합니다. 흥미로운 점 sub
은 Andrew의 솔루션을 사용해도 속도가 향상되지 않는다는 것입니다.
업데이트
이후 extract_numeric
사용되지 않습니다, 우리가 사용할 수 있습니다 parse_number
에서 readr
패키지로 제공된다.
library(readr)
parse_number(years)
여기에 또 다른 옵션이 있습니다. extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_number
음수로 재생되지는 않습니다. 시도 parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
모든 문자도 제거 할 수 있습니다.
as.numeric(gsub("[[:alpha:]]", "", years))
그러나 이것은 덜 일반화 될 수 있습니다.
우리는 또한 사용할 수 있습니다 str_extract
에서stringr
years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20 1
문자열에 여러 개의 숫자가 있고 모든 숫자를 추출하려는 경우에는 모든 마키를 반환 str_extract_all
하는 방식을 사용할 수 있습니다 str_extract
.
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"
에서 포스트 후 가보 르 그로 텐 디크의 는 R-도움말 메일 링리스트에서 포스트
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
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
2019-11-06에 reprex 패키지 (v0.3.0)로 생성됨
더 많은 정보 : https://github.com/moodymudskipper/unglue/blob/master/README.md
.*
필요한가요? 처음에 원하는 경우 사용하지 않는 이유는^[[:digit:]]+
무엇입니까?