패턴에 따라 부분 문자열 추출
문자열 목록이 있다고 가정합니다.
string = c("G1:E001", "G2:E002", "G3:E003")
이제 저는 콜론 ":", 즉 다음 부분만 포함하는 문자열의 벡터를 얻기를 바랍니다.substring = c(E001,E002,E003)
.
R에서 이것을 할 수 있는 편리한 방법이 있습니까?사용.substr
?
다음은 몇 가지 방법입니다.
하위의
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
스트르스플릿
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
읽기 테이블
read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"
서브스트링
여기에서는 두 번째 부분이 항상 네 번째 문자로 시작한다고 가정합니다(문제의 예와 같습니다).
substring(string, 4)
## [1] "E001" "E002" "E003"
4a) 하위 문자열/ 정규식
콜론이 항상 알려진 위치에 있지 않으면 콜론을 검색하여 수정할 수 있습니다(4).
substring(string, regexpr(":", string) + 1)
스트래플릭
strapplyc
괄호로 묶인 부분을 반환합니다.
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
read.dcf
이것은 콜론 이전의 하위 문자열이 고유한 경우에만 작동합니다(문제의 예에 있음).또한 구분 기호가 콜론이어야 합니다(문제에 나와 있음).만약 다른 분리기가 사용된다면 우리는 사용할 수 있습니다.sub
먼저 결장으로 대체합니다.예를 들어, 구분 기호가_
그리고나서string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
별개의
7a) 사용tidyr::separate
두 개의 열이 있는 데이터 프레임을 생성합니다. 하나는 콜론 앞에 있고 하나는 콜론 뒤에 있습니다. 그런 다음 후자를 추출합니다.
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
7b) 대안으로separate
생성하는 데만 사용할 수 있습니다.post
열 다음에unlist
그리고.unname
결과 데이터 프레임:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
사용할 수 있는 트림trimws
왼쪽에서 단어 문자를 잘라낸 다음 콜론을 잘라내는 데 다시 사용합니다.
trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"
메모
입력string
다음과 같이 가정합니다.
string <- c("G1:E001", "G2:E002", "G3:E003")
예를 들어 사용gsub
또는sub
gsub('.*:(.*)','\\1',string)
[1] "E001" "E002" "E003"
파티에 늦었지만, 후손들을 위해, stringr 패키지(인기있는 "tidyverse" 패키지 세트의 일부)는 이제 문자열 처리를 위한 조화된 서명과 함께 기능을 제공합니다.
string <- c("G1:E001", "G2:E002", "G3:E003")
# match string to keep
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
# replace leading string with ""
stringr::str_remove(string = string, pattern = "^.*:")
# [1] "E001" "E002" "E003"
여기 또 다른 간단한 대답이 있습니다.
gsub("^.*:","", string)
이 작업은 다음을 수행해야 합니다.
gsub("[A-Z][1-9]:", "", string)
기브즈
[1] "E001" "E002" "E003"
사용 중인 경우data.table
그리고나서tstrsplit()
자연스러운 선택입니다.
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
unglu 패키지는 간단한 경우 정규식에 대한 지식이 필요하지 않은 대안을 제공합니다. 여기서는 다음을 수행합니다.
# install.packages("unglue")
library(unglue)
string = c("G1:E001", "G2:E002", "G3:E003")
unglue_vec(string,"{x}:{y}", var = "y")
#> [1] "E001" "E002" "E003"
reprex 패키지(v0.3.0)에 의해 2019-11-06에 생성되었습니다.
더 많은 정보: https://github.com/moodymudskipper/unglue/blob/master/README.md
하위 문자열을 추출하는 다른 방법
library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
(?<=:)
대장 뒤쪽을 봅니다(:
)
놀랍게도 매우 "기본 R" 솔루션은 아직 추가되지 않았습니다.
string = c("G1:E001", "G2:E002", "G3:E003")
regmatches(string, regexpr('E[0-9]+', string))
언급URL : https://stackoverflow.com/questions/17215789/extract-a-substring-according-to-a-pattern
'programing' 카테고리의 다른 글
하나의 명령으로 모든 git remote에 푸시할 수 있습니까? (0) | 2023.06.20 |
---|---|
인터페이스 빌더에서 UIView 경계 속성을 설정할 수 있습니까? (0) | 2023.06.20 |
Oracle에 연결된 SQL Server에서 SQL 쿼리를 작성할 때 날짜 리터럴을 지정하려면 어떻게 해야 합니까? (0) | 2023.06.20 |
캐시를 비우고 모든 대상 Xcode 4 이상을 정리하는 방법 (0) | 2023.06.20 |
mongodb: 집계 명령의 실행 시간을 어떻게 볼 수 있습니까? (0) | 2023.06.20 |