programing tip

패턴에 따라 R에서 부분 문자열을 추출

itbloger 2020. 7. 23. 19:06
반응형

패턴에 따라 R에서 부분 문자열을 추출


문자열 목록이 있다고 가정하십시오 string = c("G1:E001", "G2:E002", "G3:E003"). 이제 콜론 ":"뒤에있는 부분 만 포함하는 문자열 벡터를 얻으려고합니다 substring = c(E001,E002,E003). R에 이것을 수행하는 편리한 방법이 있습니까? 사용 substr? 감사!


몇 가지 방법이 있습니다.

1) 하위

sub(".*:", "", string)
## [1] "E001" "E002" "E003"

2) strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"

3) 읽은 테이블

read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"

4) 부분 문자열

이것은 두 번째 부분이 항상 4 번째 문자로 시작한다고 가정합니다 (이 예제의 경우).

substring(string, 4)
## [1] "E001" "E002" "E003"

4a) 부분 문자열 / 정규식

콜론이 항상 알려진 위치에 있지 않은 경우 콜론을 검색하여 (4)를 수정할 수 있습니다.

substring(string, regexpr(":", string) + 1)

5) 스트랩

strapplyc 괄호로 묶은 부분을 반환합니다.

library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"

6) read.dcf

이것은 콜론 이전의 하위 문자열이 고유 한 경우에만 작동합니다 (문제의 예에 있음). 또한 구분 기호는 콜론이어야합니다 (문제에 있습니다). 다른 구분 기호를 사용한 경우 먼저 구분 기호를 sub콜론으로 바꾸는 데 사용할 수 있습니다 . 예를 들어, 세퍼레이터 경우였다 _그때string <- sub("_", ":", string)

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"

7) 분리 하여 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"

7A) 대안은 separate단지 만드는 데 사용할 수있는 post열 다음 unlistunname결과 데이터 프레임 :

library(dplyr)
library(tidyr)

DF %>% 
  separate(string, into = c(NA, "post")) %>% 
  unlist %>%
  unname
## [1] "E001" "E002" "E003"

추가되었습니다. strapplyc, read.dcfseparate솔루션을 제공합니다.

노트.

입력 string은 다음과 같습니다.

string <- c("G1:E001", "G2:E002", "G3:E003")

예를 들어 gsub또는sub

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"

Here is another simple answer

gsub("^.*:","", string)

Late to the party, but for posterity, the stringr package (part of the popular "tidyverse" suite of packages) now provides functions with harmonised signatures for string handling:

string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"

This should do:

gsub("[A-Z][1-9]:", "", string)

gives

[1] "E001" "E002" "E003"

If you are using data.table then tstrsplit() is a natural choice:

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"

참고URL : https://stackoverflow.com/questions/17215789/extract-a-substring-in-r-according-to-a-pattern

반응형