문자열 내 특정 문자 교체


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.