bestsource

문자열 벡터에서 숫자 추출

bestsource 2023. 6. 28. 21:53
반응형

문자열 벡터에서 숫자 추출

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

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

업데이트 이후extract_numeric더 이상 사용하지 않습니다. 사용할 수 있습니다.parse_number부터readr꾸러미

library(readr)
parse_number(years)

다음은 다음과 같은 다른 옵션입니다.extract_numeric

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

저는 대체가 해결책에 도달하는 간접적인 방법이라고 생각합니다.만약 당신이 모든 숫자를 검색하고 싶다면, 나는 추천합니다.gregexpr:

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

문자열에 일치하는 항목이 여러 개 있는 경우 모든 항목이 표시됩니다.첫 번째 일치에만 관심이 있는 경우regexpr대신에gregexpr그리고 당신은 건너뛸 수 있습니다.unlist.

간단히 말하면:

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

다음은 보다 단순한 Perl과 같은 정규 표현을 사용하는 Arun의 첫 번째 솔루션에 대한 대안입니다.

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

우리는 또한 사용할 수 있습니다.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"

A stringr파이프라인 솔루션:

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

당신은 또한 모든 글자들을 없앨 수 있습니다:

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

하지만 이것은 덜 일반화될 가능성이 높습니다.

시작 위치에 있는 문자열에서 숫자를 추출합니다.

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

위치에 관계없이 모든 문자열에서 숫자를 추출합니다.

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

가보르 그로텐디크의 게시물 후 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]])

패키지 언글루를 사용하여 다음 작업을 수행할 수 있습니다.

# 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

저는 이 질문에 관심이 있습니다. 왜냐하면 그것은 가치를 추출하는 것에 적용되기 때문입니다.base::summary()기능.테이블에서 값을 추출하기 위해 고려해야 할 또 다른 옵션은 다음 항목을 사용하는 함수를 만드는 것입니다.summary()표를 만들어 유용한 숫자로 변환합니다.예를 들어 다음과 같은 경우:

(s <- summary(dataset))

sv_final_num_beneficiarios  sv_pfam_rec        sv_area_transf    
Min.   :    1.0            Min.   :0.0000036   Min.   :0.000004  
1st Qu.:   67.5            1st Qu.:0.0286363   1st Qu.:0.010107  
Median :  200.0            Median :0.0710803   Median :0.021865  
Mean   :  454.6            Mean   :0.1140274   Mean   :0.034802  
3rd Qu.:  515.8            3rd Qu.:0.1527177   3rd Qu.:0.044234  
Max.   :17516.0            Max.   :0.8217923   Max.   :0.360924  

당신은 그것을 추출하고 싶을지도 모릅니다.1st Qu위해서sv_pfam_rec그리고 그것을 위해 2번째 대령의 2번째 열을 읽습니다.포맷된 단일 값을 얻기 위해 함수를 만들었습니다.

s_extract <- function(summary_entry){
separate(as_tibble(summary_entry),
sep = ":",
col = value, 
remove = FALSE, 
into = c("bad", "good"))[[3]] %>% 
as.numeric() 
}

예를 들어 요약 항목을 입력하면 됩니다.summary_entry = s[3,3]를 얻기 위해Mediansv_area_transf.

이 함수가 다음을 기반으로 한다는 것을 고려할 때 가치가 없습니다.separate()변수 이름에 숫자도 포함된 특정 경우를 쉽게 탐색할 수 있습니다.

언급URL : https://stackoverflow.com/questions/14543627/extracting-numbers-from-vectors-of-strings

반응형