해당 포스트에서는 R에서 문자열 패턴 검색을 위해 stringr 패키지의 str_detect(), str_subset(), str_which() 함수에 대해 소개합니다.
INTRO
앞선 포스트에서는 R에서 문자열 패턴 검색을 위한 방법으로 R 내장 함수인 grepl()
과 grep()
함수에 대해 설명하였습니다. 이번 포스트에서는 최근 문자열 검색과 관련된 문제를 다룰 때 많이 사용되는 패키지인 tidyverse의 stringr패키지를 이용하여 동일한 문제를 풀어보겠습니다.
tidyverse 패키지? stringr 패키지?
tidyverse 패키지는 데이터 분석 및 가공을 위한 유용한 함수를 제공해주는 필수 패키지이며, stringr 패키지는 tidyverse 패키지에서 제공되는 텍스트 처리에 특화된 유용한 필수 패키지 입니다.
str_detect() vs. str_subset()
str_detect()
함수는 문자열에서 특정 패턴이 있는지 여부를 검사하는 함수이고, str_subset()
함수는 문자열에서 특정 패턴과 일치하는 부분을 추출하는 함수입니다. 이 두 함수는 tidyverse 패키지에 포함되어 있습니다.
str_detect() 함수
str_detect()
함수는 문자열 벡터와 검색할 패턴을 인수로 받습니다. 패턴을 찾으면 TRUE
, 찾지 못하면 FALSE
를 반환합니다.
library(tidyverse)
x <- c("apple", "banana", "cherry", "orange", "peach")
str_detect(x, "an")
# [1] FALSE TRUE FALSE TRUE FALSE
str_subset() 함수
str_subset()
함수는 문자열 벡터와 검색할 패턴을 인수로 받습니다. 패턴과 일치하는 부분 문자열만 추출하여 반환합니다.
y <- c("apple", "banana", "cherry", "orange", "peach")
str_subset(y, "an")
# [1] "banana" "orange"
위의 코드에서는 str_subset()
함수를 사용하여 y
벡터의 각 요소에서 "an" 패턴과 일치하는 부분 문자열을 추출합니다. 결과적으로, "an" 패턴과 일치하는 "banana"와 "orange"만 반환됩니다. 이러한 함수는 텍스트 데이터에서 특정 패턴을 찾는 데 유용합니다. 특히, str_subset()
함수는 특정 패턴과 일치하는 모든 부분 문자열을 추출하여 데이터의 세부 정보를 빠르게 확인 할 수 있습니다.
예시 코드 설명
아래에서는 앞선 포스트와 동일한 데이터로 내장 함수인 grepl()
,grep()
함수와 str_detect()
, str_subset()
, str_which()
를 비교하여 설명합니다.
먼저, 샘플 데이터인 문자열 벡터 x
와 y
를 생성합니다.
x <- c("a","g","o","y")
y <- c("apple","banana","graph","orange","peach","cherry")
grepl() vs. str_detect()
아래 코드에서는 str_detect()
함수를 사용하여 x
벡터의 각 요소에서 "a" 패턴이 있는지 확인합니다. 결과적으로, x
벡터의 마지막 요소에는 "a" 패턴이 없으므로 FALSE
가 반환되며, 나머지 요소에는 "a" 패턴이 있으므로 TRUE
가 반환됩니다.
# grepl(pattern = x[1], x = y)
str_detect(y, x[1])
[1] TRUE TRUE TRUE TRUE TRUE FALSE
grep() vs. str_subset()
이레 코드에서는 str_subset()
함수를 이용하여 x
벡터의 각 요소에서 "a" 패턴과 일치하는 부분 문자열을 추출합니다. 결과적으로, "a"패턴과 일치하는 "apple", "banana", "graph", "orange", "peach"가 반환됩니다.
str_subset()
은 문자열에서 특정 패턴을 갖는 문자열만 추출하며, 세 번째 인자로 ignore_case = TRUE
를 입력하면 대소문자를 구분하지 않습니다.
# grep(pattern = x[1], x = y, value = T)
str_subset(y, x[1])
[1] "apple" "banana" "graph" "orange" "peach"
grep() vs. str_which()
stringr 패키지에서는 str_which()
함수를 사용하여 문자열 벡터에서 매칭된 인덱스를 얻을 수 있습니다. 이 함수는 str_detect()
함수와 유사하게 작동하지만, str_detect()
함수가 매칭 여부를 논리값으로 반환하는 것과는 달리, str_which()
함수는 매칭된 인덱스를 정수형 벡터로 반환합니다.
# grep(pattern = x[1], x = y, ignore.case = T)
str_which(y, x[1])
[1] 1 2 3 4 5
결론
tidyverse 패키지의 stringr 패키지에서 제공하는 함수를 이용하면 더 간결하고 직관적인 코드를 작성할 수 있습니다. R의 기본 함수와 tidyverse 패키지의 함수를 적절하게 조합하여 사용하는 것이 데이터 분석 작업에서 효율적인 코딩 방법입니다.
관련 링크
[1] [R] 텍스트 데이터 처리 Tip and Tricks (feat. stringr)
[2] [R] 문자열 분리, 공백 제외 문자 카운트 하기 (feat. stringr)
[3] [R] 문자열에서 패턴 검색하기 (feat. grep, grepl)