카테고리 없음

str_replace, str_split, str_count

23임규민 2023. 11. 13. 18:48

 

str_replace() · str_replace_all()

 

str_replace()함수는 문자열에서 특정 패턴을 찾아 지정된 패턴으로 바꿔주는 기능을 가진다.

 

install.packages("stringr")
library(stringr)

우선 stringr을 설치&실행하자.

 

str_replace 함수는 다음과 같은 형식이다.

str_replace('문자','문자 내 치환 대상 값','치환 값')

 

 

만약 당신이 특정 문자에서 처음으로 일치하는 값만을 치환하고 싶다면 str_replace

일치하는 모든 값을 치환하고 싶다면 str_replace_all을 사용하면 된다.

 

문자열 '아이스크림을먹는아이'에서 '아'를 A로 치환하고 싶은 경우

 

str_replace을 사용하는 경우

> str_replace('아이스크림을먹는아이','아','A')
[1] "A이스크림을먹는아이"

∴ str_replace 함수는 처음으로 일치하는 값만을 치환하므로 맨 처음 오는 '아'만 치환한다.

 

 

str_replace_all을 사용하는 경우

> str_replace_all('아이스크림을먹는아이','아','A')
[1] "A이스크림을먹는A이"

∴ str_replace_all 함수는 일치하는 모든 값을 치환하므로 문자 내의 모든 '아'를 A로 치환한다.

 

 

☆그럼 만약 두 가지 함수의 기능이 아닌, 문자 내에서 두 번째로 매칭되는 값만을 치환하고 싶으면 어떻게 해야할까?

 

다음과 같이 정규식을 사용하면 된다.

> str_replace('아이스크림을먹는아이','(.*?아.*?)아','\\1A')
[1] "아이스크림을먹는A이"

 

'(.*아.*?)아' 를 통해 두 번째 '아'가 나올 때까지 모든 문자열을 하나의 그룹으로 묶는 역할을 하고, 이후 '아'가 나오면 'A'로 치환하는 것이다.

 

 -질문: 솔직히 잘 몰라서 지피티에게 물어보았다. 지피티가 설명해주는 바에 따르면 '(.*?아.*?)아'가 두 번째 '아'가 나오기 전까지 모든 문자열을 첫 번째 그룹으로 캡처하고 이를 'A'로 대체한다고 하는데, 그럼 '아이스크림을먹는A이'가 아니라 'A아이'로 나오는 것 아닌가?

str_split

str_split 함수는 문자열을 어떤 기준으로 나누는 데 사용된다. 

 

1.공백으로 나눌 때

> spt<-c("경희대학교 경영대학","경희대학교 정경대학","경희대학교 호텔관광대학","경희대학교 의과대학")
> str_split(spt," ")
[[1]]
[1] "경희대학교" "경영대학"  

[[2]]
[1] "경희대학교" "정경대학"  

[[3]]
[1] "경희대학교"   "호텔관광대학"

[[4]]
[1] "경희대학교" "의과대학"

 

 

spt에 "경희대학교 경영대학","경희대학교 정경대학","경희대학교 호텔관광대학","경희대학교 의과대학" 이라는 원소를 지정해주었다. 이후 각 원소 내에서 " "(공백)을 기준으로 분류하였다.

 

모든 문자열을 한 글자씩 분리한 후 unlist()함수를 사용하면 리스트가 벡터화된다.

> spt<-c("경희대학교 경영대학","경희대학교 정경대학","경희대학교 호텔관광대학","경희대학교 의과대학")
> a1<-str_split(spt,"")
> a1
[[1]]
 [1] "경" "희" "대" "학" "교" " "  "경" "영" "대"
[10] "학"

[[2]]
 [1] "경" "희" "대" "학" "교" " "  "정" "경" "대"
[10] "학"

[[3]]
 [1] "경" "희" "대" "학" "교" " "  "호" "텔" "관"
[10] "광" "대" "학"

[[4]]
 [1] "경" "희" "대" "학" "교" " "  "의" "과" "대"
[10] "학"

 

> unlist(a1)
 [1] "경" "희" "대" "학" "교" " "  "경" "영" "대"
[10] "학" "경" "희" "대" "학" "교" " "  "정" "경"
[19] "대" "학" "경" "희" "대" "학" "교" " "  "호"
[28] "텔" "관" "광" "대" "학" "경" "희" "대" "학"
[37] "교" " "  "의" "과" "대" "학"

 

질문:중간에 공백도 한 벡터로 계산되는데, 이 벡터를 제외하고 싶으면 어떻게 해야하는가?

str_count()

str_count() 함수는 특정 문자 혹은 패턴과 일치하는 횟수를 세는 데 사용된다.

 

문자열 내에 패턴과 일치하는 문자가 있으면 횟수가 증가한다.

> school<-c("kyunghee","yonsei","korea","kaist","hanynag")
> str_count(school,"e")
[1] 2 1 1 0 0

 

다음과 같이 "kyunghee","yonsei","korea","kaist","hanyang"이라는 문자열에서 e라는 패턴과 일치하는 횟수를 구할 수 있다.

 

만약 각 문자열마다 다른 기준의 패턴을 부여하고 싶다면 다음과 같이 각 문자열의 순서대로 부여하고 싶은 패턴을 작성하면 된다.

> str_count(school,c("g","y","i","g","a"))
[1] 1 1 0 0 2

 

-질문:만약 1~2번째엔 g라는 패턴을, 3~5엔 a라는 패턴을 부여하고 싶을 때 번거롭게 c() 안에 넣는 것이 아닌 간단하게 코드를 작성하는 방법은 없는가?