[R] 문자열에서 패턴 검색하기 (feat. str_detect, str_subset, str_which)

해당 포스트에서는 R에서 문자열 패턴 검색을 위해 stringr 패키지의 str_detect(), str_subset(), str_which() 함수에 대해 소개합니다.

how-to-pattern-search-in-string-using-r-stringr

INTRO

앞선 포스트에서는 R에서 문자열 패턴 검색을 위한 방법으로 R 내장 함수인 grepl()grep() 함수에 대해 설명하였습니다. 이번 포스트에서는 최근 문자열 검색과 관련된 문제를 다룰 때 많이 사용되는 패키지인 tidyversestringr패키지를 이용하여 동일한 문제를 풀어보겠습니다.

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()를 비교하여 설명합니다.

먼저, 샘플 데이터인 문자열 벡터 xy를 생성합니다.

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)