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() 안에 넣는 것이 아닌 간단하게 코드를 작성하는 방법은 없는가?