문자열 내 특정 문자 교체


262

Excel 의 찾기 및 바꾸기 기능 비슷한 벡터 내의 문자열에서 특정 문자를 제거하고 싶습니다 .

내가 시작하는 데이터는 다음과 같습니다.

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

첫 번째 열부터 시작합니다. 의을 제거하여 두 번째 열을 생성하고 싶습니다 e.

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

답변:


399

정규 표현식과 함수로 gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

어떤 gsub여기 일은 각각의 발생을 교체하는 것입니다 "e"빈 문자열로 "".


자세한 내용은 ?regexp또는 참조하십시오 gsub.


15
fixed = TRUE이것을 더 빨리 만들 것입니다.
Rich Scriven

4
@RichScriven 잠시 이유를 설명해 주시겠습니까?
기뻐

6
fixed=TRUER이 정규식을 사용하지 못하게하여보다 유연한 패턴 일치를 허용하지만 계산 시간이 걸립니다. 필요한 모든 것이 단일 상수 문자열 "e"를 제거하는 것이라면 필요하지 않습니다.
mm689

sub("e", "", group)같은 결과를 저장?
Matheus Santana

바로 첫 번째 대체 할 e각 요소에 발견을
sindri_baldur

47

정규식은 친구입니다.

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

이제 gsub()가장 간단한 대체 패턴을 사용하십시오 : 빈 문자열 :

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
또한 ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
글쎄, 나는 기본 기능을 이해하지 못하는 사람들은 그것들을 대체 할 운명에 처해있다. 소스 파일에서 밑줄 수를 늘리는 것 외에도 스트링거가 정확히 무엇을 얻습니까?
Dirk Eddelbuettel

8
" stringr는 패키지 작성자로부터 R의 문자열 기능을보다 일관되고 단순하며 사용하기 쉽게 만드는 간단한 래퍼 세트입니다 . 따라서 당신이 말하는 것이 사실이라면 (기본 함수를 감싸는 데 많은 밑줄이 있습니다 ...)이 패키지가 존재할 이유가 없습니다 (면책 조항 : 나는 주로 기본 정규식 함수를 사용하지만 새로운 사용자에게는 어려울 수 있음을 알고 있습니다 ... )
dickoa

17
@dickoa : str_replacewraps sub이므로 처음 나타나는 패턴 만 대체합니다. str_replace_all와 동일한 동작을 원하면 사용해야 합니다 gsub.
Joshua Ulrich

24

문자열을 바꾸는 두 가지 방법을 요약하면 다음과 같습니다.

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) 사용 gsub

group$group.no.e <- gsub("e", "", group$group)

2) stringr패키지 사용

group$group.no.e <- str_replace_all(group$group, "e", "")

둘 다 원하는 출력을 생성합니다.

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
당시 주석에서 주로 논의 되었 듯이 선호하는 방법 인 stringr의 구문을 배우기 위해 주석을 포함한 전체 페이지를 읽어야했습니다. 이 솔루션은 두 가지 옵션을 모두 신속하게 제시하므로 제공했습니다. 나는 R. 내가 stringr을 발견하기 전에 GSUB 고투에 내가 새로운 때해야 할 일을했을처럼 내 희망은 훨씬 통해 도움을 다른 사용자 필터에 있었다 때문에 그것은 매우 upvoted 대답에 언급되지 않았다. 다시 한 번, 목표는 투표를 수집하는 것이 아니라 새로운 R 사용자를 돕기위한 것입니다.
Megatron

유용하고 다른 답변으로 변환하고 싶은 다른 답변 / 의견에서 정보를 찾은 경우, 정보를 어디에서 얻었는지 / 공인 위키를 정답으로 만드는 대신 정보를 어디서 얻었는지 보여주기 위해 최소한의 속성을 제공 할 수 있습니다. 너 스스로.
David Arenburg

감사합니다-다음에 명심하십시오. 전에 커뮤니티 위키를 만든 적이 없으므로 그것이 옵션인지 몰랐습니다.
Megatron

1
옵션 2는 열의 모든 값을 지정하지 않고 데이터 프레임의 데이터 열에 적용될 때 효과적입니다. 분명히 옵션 1은 반복적이지만 옵션 2는 매우 잘 작동하며 추가 된 기능에 대해 투표권이 있습니다.
Phil_T

6

일부 문자를 바꾸려면 문자열 벡터에서 데이터 프레임을 만들 필요가 없습니다. @Andrie와 @Dirk Eddelbuettel에 의해 이미 언급되었으므로 정규식이 적합합니다.

점과 같은 특수 문자를 바꾸려면 아래 예제와 같이 정규식 구문을 완전히 사용해야합니다.

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

이것은 생산할 것이다

[1] "Czech Republic" "New Zealand"    "Great Britain" 

당신은 그냥 탈출 할 수 있지만, 인용 문자이기 때문에 탈출 문자뿐만 아니라 탈출해야합니다 :gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

stringi 패키지를 사용하십시오 .

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.