문자열 벡터에서 숫자 추출
다음과 같은 문자열이 있습니다.
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]
를 얻기 위해Median
의sv_area_transf
.
이 함수가 다음을 기반으로 한다는 것을 고려할 때 가치가 없습니다.separate()
변수 이름에 숫자도 포함된 특정 경우를 쉽게 탐색할 수 있습니다.
언급URL : https://stackoverflow.com/questions/14543627/extracting-numbers-from-vectors-of-strings
'bestsource' 카테고리의 다른 글
엔티티에 기본 키가 없는 보기 사용 (0) | 2023.07.03 |
---|---|
Oracle jdbc에서 문 준비 및 타임스탬프 설정 (0) | 2023.07.03 |
쿼츠 스케줄러의 각 테이블은 무엇을 의미합니까? (0) | 2023.06.28 |
실행 중인 스크립트의 경로 결정 (0) | 2023.06.28 |
파이썬을 사용하여 문자열에서 숫자를 제외한 문자를 제거하시겠습니까? (0) | 2023.06.28 |