[R] stringr 문자열 관련 처리 함수

반응형

stringr

  • 이번 포스팅에서는 stringr 라이브러리에서 주로 다루는 함수에 대해서 정리해보겠습니다.
  • stringr 라이브러리는 tidyverse 라이브러리를 구동할 때 같이 불러오는 라이브러리 중 하나 입니다.
  • 이 라이브러리는 주로 문자열 데이터를 다루는 함수를 내포하고 있습니다.



발견 관련

str_detect()

  • 문자열에서 패턴의 일치여부를 찾아 논리값(TRUE 또는 FALSE)을 출력합니다.
    • 논리값은 수치계산 시에 TRUE는 1, FALSE는 0으로 취급됩니다.
str_detect(string, pattern)
text <- c("자세히 보아야 예쁘다",
          "오래 보아야 사랑스럽다",
          "너도 그렇다")

text_df <- tibble(
  seq = 1:length(text),
  text = text
)
text
## [1] "자세히 보아야 예쁘다"   "오래 보아야 사랑스럽다" "너도 그렇다"
text %>% str_detect(pattern = "보아야")
## [1]  TRUE  TRUE FALSE
text_df
## # A tibble: 3 x 2
##     seq text                  
##   <int> <chr>                 
## 1     1 자세히 보아야 예쁘다  
## 2     2 오래 보아야 사랑스럽다
## 3     3 너도 그렇다
text_df %>% 
  filter(str_detect(string = text, pattern = "보아야"))
## # A tibble: 2 x 2
##     seq text                  
##   <int> <chr>                 
## 1     1 자세히 보아야 예쁘다  
## 2     2 오래 보아야 사랑스럽다
text_df %>% 
  unnest_tokens(input = text, output = "word") %>% 
  filter(str_detect(string = word, pattern = "보아야"))
## # A tibble: 2 x 2
##     seq word  
##   <int> <chr> 
## 1     1 보아야
## 2     2 보아야

 

str_which()

  • 문자열에서 패턴의 인덱스를 찾아 숫자값을 출력합니다.
str_which(string, pattern)
text
## [1] "자세히 보아야 예쁘다"   "오래 보아야 사랑스럽다" "너도 그렇다"
text %>% str_which(pattern = "보아야")
## [1] 1 2

 

str_count()

  • 문자열에서 패턴과 일치하는 문자의 빈도를 계산합니다.
  • 디폴트값은 패턴이 없기에 각 요소에 있는 글자 길이를 모두 계산합니다.
str_count(string, pattern = "")
text <- c("꽃이 피고 새잎 나는 날",
          "마음아 너도 거기서",
          "꽃 피우고 새잎 내면서",
          "놀고 있거라")

text_df <- tibble(
  seq = 1:length(text),
  text = text
)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_count("꽃")
## [1] 1 0 1 0
text %>% 
  str_count()
## [1] 13 10 12  6
text_df
## # A tibble: 4 x 2
##     seq text                  
##   <int> <chr>                 
## 1     1 꽃이 피고 새잎 나는 날
## 2     2 마음아 너도 거기서    
## 3     3 꽃 피우고 새잎 내면서 
## 4     4 놀고 있거라
text_df %>% 
  unnest_tokens(input = text, output = "word") %>% 
  filter(str_count(word, "꽃") >= 1)
## # A tibble: 2 x 2
##     seq word 
##   <int> <chr>
## 1     1 꽃이 
## 2     3 꽃

 

str_locate()

  • 문자열에서 첫 번째 패턴이 어느 위치에서 시작해 어느 위치에서 끝나는 지 출력한다.
  • 참고로 문자열의 공백 역시 1의 길이 값을 갖는 것으로 간주합니다.
str_locate(string, pattern)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_locate(pattern = "새잎")
##      start end
## [1,]     7   8
## [2,]    NA  NA
## [3,]     7   8
## [4,]    NA  NA



추출 관련

str_sub()

  • 문자벡터의 시작과 끝나는 지점의 값으로 문자열을 출력합니다.
  • 시작과 끝나는 지점 값을 음수로 지정하면 역순으로 출력합니다.
str_sub(start, end)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_sub(start = 1, end = 5)
## [1] "꽃이 피고" "마음아 너" "꽃 피우고" "놀고 있거"
text %>% 
  str_sub(start = 1, end = -3)
## [1] "꽃이 피고 새잎 나는" "마음아 너도 거"      "꽃 피우고 새잎 내"  
## [4] "놀고 있"

 

str_subset()

  • 문자열에서 패턴을 찾아 해당 패턴이 포함된 요소들을 산출합니다.
  • negate = TRUE argument를 주면 해당 패턴이 없는 요소를 산출합니다.
str_subset(string, pattern, negate = FALSE)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_subset(pattern = "새잎")
## [1] "꽃이 피고 새잎 나는 날" "꽃 피우고 새잎 내면서"
text %>% 
  str_subset(pattern = "새잎", negate = TRUE)
## [1] "마음아 너도 거기서" "놀고 있거라"

 

str_extract()

  • 문자열에서 일치하는 첫 번째 패턴을 찾아 벡터로 출력합니다.
  • 문자열에서 추출 관련 함수들은 정규표현식을 패턴 파라미터에 섞어서 종종 쓰입니다.
str_extract(string, pattern)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_extract(pattern = "피고")
## [1] "피고" NA     NA     NA

 

str_match()

  • 문자열에서 일치하는 패턴을 찾아 행렬로 출력합니다.
  • str_extract() 함수와 비슷하지만 출력하는 결과가 다릅니다.
str_match(string, pattern)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_match(pattern = "피고")
##      [,1]  
## [1,] "피고"
## [2,] NA    
## [3,] NA    
## [4,] NA



변환 관련

str_replace()

  • 문자열에서 특정 패턴을 찾아 지정된 패턴으로 바꿔줍니다.
str_replace(string, pattern, replacement)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_replace(pattern = "피우고", replace = "피고")
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피고 새잎 내면서"   
## [4] "놀고 있거라"

 

str_remove()

  • 문자열에서 패턴을 찾아 해당 요소를 제거합니다.
str_remove(string, pattern)
text
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] "놀고 있거라"
text %>% 
  str_remove(pattern = "놀고")
## [1] "꽃이 피고 새잎 나는 날" "마음아 너도 거기서"     "꽃 피우고 새잎 내면서" 
## [4] " 있거라"



분리 관련

str_split()

  • 문자열에서 패턴을 찾아 분리하여 리스트 형태로 출력합니다.
str_split(string, pattern)
text %>% 
  str_split(pattern = " ")
## [[1]]
## [1] "꽃이" "피고" "새잎" "나는" "날"  
## 
## [[2]]
## [1] "마음아" "너도"   "거기서"
## 
## [[3]]
## [1] "꽃"     "피우고" "새잎"   "내면서"
## 
## [[4]]
## [1] "놀고"   "있거라"
  • str_split_fixed() 함수도 있는데 이는 동일하게 분리하여 행렬 구조로 출력합니다.
str_split_fixed(string, pattern, n)
text %>% 
  str_split_fixed(pattern = " ", n = 5)
##      [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] "꽃이"   "피고"   "새잎"   "나는"   "날"
## [2,] "마음아" "너도"   "거기서" ""       ""  
## [3,] "꽃"     "피우고" "새잎"   "내면서" ""  
## [4,] "놀고"   "있거라" ""       ""       ""



공백 처리 관련

str_squish()

  • 문자열에서 모든 공백문자를 단일 스페이스로 취급합니다.
str_squish(string)
c("  마스크  없는   일상으로     돌아가고  싶습니다")
## [1] "  마스크  없는   일상으로     돌아가고  싶습니다"
c("  마스크  없는   일상으로     돌아가고  싶습니다  ") %>% 
  str_squish()
## [1] "마스크 없는 일상으로 돌아가고 싶습니다"

 

str_trim()

  • 문자열에서 모든 종류의 공백을 단일 스페이스 공백으로 취급합니다만 양 끝에 있는 값들만 취급합니다.
  • side = c("both", "left", "right") argument를 활용하여 끝을 지정할 수 있습니다.
str_trim(string, side)
c("  마스크  없는   일상으로     돌아가고  싶습니다") %>% 
  str_trim(side = "left")
## [1] "마스크  없는   일상으로     돌아가고  싶습니다"
반응형

'tidytext' 카테고리의 다른 글

[R] unnest_tokens()  (0) 2021.07.17
[R] 2. Sentiment analysis with tidy data  (0) 2021.07.17
[R] 정규표현식 관련  (0) 2021.07.15
[R] 1. Tidy text format  (0) 2021.07.14
[R] 텍스트 데이터 분석을 위한 라이브러리 준비  (0) 2021.07.14
TAGS.

Comments