문자열의 일부 제거


90

문자열의 일부를 제거하려면 어떻게합니까? 예를 들어 ATGAS_1121I want to remove everything before _.

답변:


131

정규식을 사용하십시오. 이 경우 다음을 사용할 수 있습니다 gsub.

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

이 정규식은 문자열의 시작 (^), 0 회 이상 반복되는 모든 문자 (.) (*) 및 밑줄 (_)과 일치합니다. ? 일치 만 첫 번째 밑줄만큼 멀도록 일치를 "지연"으로 만듭니다. 해당 일치는 밑줄로 대체됩니다. 자세한 ?regex내용 및 참조는를 참조하십시오.


6
예를 들어, 이전 정규식은 마지막 밑줄과 일치합니다 gsub("^.*_","_","ATGAS_1121_xxx"). 이제 수정되었습니다.
Richie Cotton

7
@Joshua 정규 표현식의 역할을 설명해 주신 것이 정말 유용하다고 생각합니다.
Vasile

이것은 또한 마지막 인수로 문자열 벡터와 함께 작동합니다. R은 그렇게 굉장합니다.
naught101

37

이를 위해 내장 strsplit 을 사용할 수 있습니다 .

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplitsplit 매개 변수 에서 구문 분석 된 문자열을 목록 으로 반환 합니다 . 그것은 아마도 당신이 원하는 것이 아니므로 unlist 에서 호출을 래핑 한 다음 벡터의 두 요소 중 두 번째 요소 만 반환되도록 해당 배열 을 인덱싱 하십시오.

마지막으로 고정 매개 변수는 분할 매개 변수가 정규 표현식이 아니라 리터럴 일치 문자임을 나타 내기 위해 TRUE로 설정되어야합니다.


23

Tidyverse와 같은 사람이라면 다음은 스트링거 솔루션입니다.

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

벡터 인 strsplit경우 솔루션 s은 다음과 같습니다 .

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
매우 도움이되었습니다, 감사합니다! 참고로 문자열의 첫 부분 (즉, '_'앞)을 얻으려면 끝에있는 [2]를 [1]로 바꿉니다.
stevenjoe

4

아마도 가장 직관적 인 해결책은 아마도 2가 아닌 하나의 인수 만있는 것보다 훨씬 쉬운 stringr함수 를 사용하는 것입니다.str_removestr_replace

예제에서 유일한 까다로운 부분은 밑줄을 유지하고 싶지만 가능하다는 것입니다 (?=pattern). 지정된 문자열 패턴을 찾을 때까지 정규 표현식과 일치해야합니다 .

예보기 :

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

여기에 패키지를 strsplit사용하는 데이터 프레임에 대한 솔루션dplyr

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.