5 min read

stringr 패키지

오늘은 stringr 패키지의 주요 함수에 대해 알아보고자 합니다. stringr 패키지는 텍스트 데이터 전처리를 위해 필요한 함수들을 제공합니다.

stringr 패키지의 주요 함수로는 다음과 같은 작업을 할 수 있습니다.

  • str_detect : 문자열이 패턴을 포함하고 있는지 확인하기
  • str_remove : 문자열로부터 특정 패턴을 삭제하기
  • str_replace : 문자열로부터 특정 패턴을 다른 패턴으로 교체하기
  • str_extract : 문자열로부터 특정 패턴을 추출하기
  • str_sub : 문자열을 인덱스로 자르기
  • str_c : 여러 문자열을 하나로 묶기
  • str_split : 문자열을 구분자를 기준으로 분리하기
  • str_trim : 문자열의 양 옆에 있는 공백 제거하기

먼저 필요한 패키지들을 라이브러리 합니다.

library(dplyr)
library(tidyverse)
library(stringr)

str_detect

str_detect 함수는 문자열에 지정된 패턴이 포함되어 있는지 확인하여 포함되어 있으면 TRUE 포함되어 있지 않으면 FALSE를 출력합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_detect(pattern = "우리나라")
## [1] TRUE

string %>% 
  str_detect(pattern = "하나님")
## [1] FALSE

string %>% 
  str_detect(pattern = "하.님") # . : 줄바꿈을 제외한 모든 글자 하나
## [1] TRUE

str_remove

str_remove 함수는 문자열로부터 지정된 패턴을 삭제합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_remove(pattern = " ") # 지정된 패턴을 문자열에서 한번 삭제
## [1] "동해물과백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

이때 str_remove() 함수는 문자열에서 맨 처음 나오는 패턴을 한번 삭제하는 것을 볼 수 있습니다. 지정된 패턴이 여러번 나오는 경우, str_remove_all() 함수를 통해 지정된 패턴을 문자열에서 모두 삭제할 수 있습니다.

string %>% 
  str_remove_all(pattern = " ") # 지정된 패턴을 문자열에서 모두 삭제
## [1] "동해물과백두산이마르고닳도록하느님이보우하사우리나라만세"

string2 <- c("동해 물과 백두 산이", "서해 바다는 산이 없다")

string2 %>% 
  str_remove(pattern = " ") # 각각의 원소인 문자열에서 첫번째 공백만 제거
## [1] "동해물과 백두 산이"   "서해바다는 산이 없다"

string2 %>% 
  str_remove_all(pattern = " ") # 각각의 원소인 문자열에서 모든 공백을 제거
## [1] "동해물과백두산이"   "서해바다는산이없다"

str_replace

str_replace 함수는 문자열로부터 지정된 패턴을 다른 패턴으로 교체합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_replace(pattern = " ", replacement = "_")
## [1] "동해물과_백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"
# 각 문자열에 대하여 지정된 패턴을 다른 패턴으로 한번 교체

이때 str_replace() 함수는 문자열에서 맨 처음 나오는 패턴을 한번 교체하는 것을 볼 수 있습니다. 지정된 패턴이 여러번 나오는 경우, str_replace_all() 함수를 통해 지정된 패턴을 문자열에서 모두 교체할 수 있습니다.

string %>% 
  str_replace_all(pattern = " ", replacement = "_")
## [1] "동해물과_백두산이_마르고_닳도록_하느님이_보우하사_우리나라_만세"
# 각 문자열에 대하여 지정된 패턴을 다른 패턴으로 모두 교체

str_extract

str_extract 함수는 문자열로부터 지정된 패턴을 추출합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_extract(pattern = "우")
## [1] "우"
# vector 형태로 출력

이때 str_extract() 함수는 문자열에서 맨 처음 나오는 패턴을 한번 추출하는 것을 볼 수 있습니다. 지정된 패턴이 여러번 나오는 경우, str_extract_all() 함수를 통해 지정된 패턴을 문자열에서 모두 추출할 수 있습니다.

string %>% 
  str_extract_all(pattern = "우")
## [[1]]
## [1] "우" "우"
# list 형태로 출력

str_extract() 함수는 vector 형태로 결과를 출력하는 반면 str_extract_all() 함수는 list 형태로 결과를 출력한다는 점에 유의해야 합니다. str_extract_all() 함수 안에 simplify = TRUE 인자를 추가할 경우 list 대신 matrix로 결과를 출력합니다.

string %>% 
  str_extract_all(pattern = "우", simplify = TRUE)
##      [,1] [,2]
## [1,] "우" "우"
# matrix 형태로 출력

각각의 문자열을 원소로 갖는, 즉 원소가 여러개인 vector를 str_extract_all() 함수에 할당해보면 이를 보다 잘 이해할 수 있습니다.

string1 <- c('우', '우우수', '수수', '우수수', '우수우수')

string1 %>% 
  str_extract_all(pattern = '우')
## [[1]]
## [1] "우"
## 
## [[2]]
## [1] "우" "우"
## 
## [[3]]
## character(0)
## 
## [[4]]
## [1] "우"
## 
## [[5]]
## [1] "우" "우"

string1 %>% 
  str_extract_all(pattern = '우', simplify = TRUE)
##      [,1] [,2]
## [1,] "우" ""  
## [2,] "우" "우"
## [3,] ""   ""  
## [4,] "우" ""  
## [5,] "우" "우"

str_sub

str_sub 함수는 문자열의 인덱스를 이용하여 문자열 인덱싱을 가능하게 합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_sub(start = 1, end = 2)
## [1] "동해"

string %>% 
  str_sub(start = 3, end = 4)
## [1] "물과"

string %>% 
  str_sub(start = 5, end = 7)
## [1] " 백두"

str_extract 함수는 패턴을 지정하여 지정된 패턴과 일치하는 부분을 추출한다면, str_sub 함수는 인덱스를 지정하여 지정된 인덱스에 해당되는 부분을 추출한다고 볼 수 있습니다.

str_c

str_c 함수는 여러개의 문자열을 한개의 문자열로 묶어줍니다. 즉 문자열 바인딩을 가능하게 합니다.

str_c("우리나라", "만세", "대박")
## [1] "우리나라만세대박"

str_c() 함수에 sep = ""를 인자로 추가할 경우, 지정된 구분자로 문자열을 합칠 수 있습니다.

str_c("우리나라", "만세", sep = " ")
## [1] "우리나라 만세"
str_c("우리나라", "만세", sep = "+")
## [1] "우리나라+만세"

str_c() 함수에 collapse = ""를 인자로 추가할 경우, 지정된 구분자로 문자열을 합칠 수 있습니다.

string2 <- c("동해물과", "백두산이", "마르고", "닳도록", "하느님이", "보우하사", "우리나라", "만세")

string2 %>% 
  str_c(collapse = " ")
## [1] "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

정리해보자면, sep = "" 인자는 str_c() 함수에 문자열들을 직접 할당했을 때 사용하는 반면 collapse = "" 인자는 str_c() 함수에 문자열들을 원소로 갖는 vector를 할당했을 때 사용합니다.

str_split

str_split 함수는 문자열을 분리하는 기능을 합니다. 한개의 문자열을 특정 구분자를 기준으로 여러개의 문자열로 분리합니다. 이때 결과는 무조건 list로 반환합니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_split(pattern = " ") %>% 
  unlist()
## [1] "동해물과" "백두산이" "마르고"   "닳도록"   "하느님이" "보우하사" "우리나라"
## [8] "만세"

str_trim

str_trim 함수는 문자열 양 옆의 개행 및 공백을 제거하는 기능을 합니다.

string <- "\r\n\t\t\t\t 하느님이 보우하사 \r\n\t\t\t\t"
string %>% 
  str_trim()
## [1] "하느님이 보우하사"

위에서 볼 수 있듯이, str_trim() 함수는 문자열 중간에 있는 개행 및 공백을 제거하지는 못합니다. 이를 위해서는 다음에 배울 정규표현식이 필요합니다.


참고 : list를 vector로 변환하는 방법

앞서 살펴본 몇몇 함수들에서, 결과를 list로 반환하는 함수들이 존재했습니다. 이렇게 list로 반환된 결과를 vector로 변환하는 방법에 대해 알아보고자 합니다.

먼저 가장 간단한 방법으로 unlist() 함수를 통해 list를 vector로 바꿔줄 수 있습니다.

string <- "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"

string %>% 
  str_extract_all(pattern = "우") %>% # list 형태로 출력
  unlist() # list 형태를 해제하고 vector 형태로 출력
## [1] "우" "우"

다음으로 sapply(X = , FUN = ) 함수는 X에 할당된 list 혹은 vector의 각각의 원소에 접근하여 FUN에 할당된 함수를 적용합니다. 이를 활용하여 list를 슬라이싱 해 list로부터 vector를 얻을 수 있습니다.

addr <- c("서울 강남구", "경기도 수원시", "인천광역시 남구")

sido <- addr %>% 
  str_split(pattern = " ") %>% 
  sapply(FUN = `[[`, 1) # `[[` : slicing을 하는 함수를 표현

gu <- addr %>% 
  str_split(pattern = " ") %>% 
  sapply(FUN = `[[`, 2)