[R] 텍스트 데이터 처리 Tip and Tricks (feat. stringr)

해당 포스트에서는 R에서 텍스트(문자) 데이터 처리를 위한 10가지 Tip and Tricks 를 소개합니다.

R에서 텍스트(문자) 데이터 처리 팁
▲ R에서 텍스트(문자) 데이터 처리 팁

INTRO

R에서 텍스트 데이터를 다루기 위해 가장 많이 사용되는 패키지는 stringr 패키지 입니다. R언어의 필수 패키지인 Tidyverse 에 포함되었을 정도로 활용성이 높은 패키지이며 일반적인 기능과 다양한 팁들을 소개하는 내용이 R-bloggers 에 업로드되어 공유하게 되었습니다.

stringr 패키지 기능 소개

함수의 실제 동작 결과를 함께 설명하기 위해 5개 문자열 벡터로 구성된 statement를 생성하도록 하겠습니다.

install.packages("stringr")
library(stringr)

statement <- c("R", "is powerful", "tool", "for data", "analysis")
statement
## [1] "R"           "is powerful" "tool"        "for data"    "analysis"

1. Word Length

str_length() 함수를 이용해 문자열 길이를 계산할 수 있습니다. 단일 문자열을 입력하면 공백(space)을 포함한 전체 문자 개수를 출력합니다. (공백(space)도 1개로 카운트 됩니다.)

str_length("R is powerful tool for data analysis")
## [1] 36

statement 변수와 같이 5개 문자열로 구성된 데이터를 입력하면 문자열별 문자 개수를 출력합니다.

str_length(statement)
## [1]  1 11  4  8  8

2. Concatenate

str_c() 함수를 이용해 문자열들을 연결할 수 있습니다. 만약, 문자 연결자를 지정하고 싶다면 collapse 옵션을 활용하시면 됩니다.

str_c(statement, collapse = " ")
## [1] "R is powerful tool for data analysis"
str_c(statement, collapse = "-")
## [1] "R-is powerful-tool-for data-analysis"

TIP : 반복 문자열 생성

str_c()를 이용하면 반복 패턴을 가지는 텍스트(변수명)를 생성할 수 있습니다. 문자 연결자를 지정하고 싶다면 sep 옵션을 활용하시면 됩니다.

str_c("test", 1:10, sep = "-")
## [1] "test-1"  "test-2"  "test-3"  "test-4"  "test-5"  "test-6"  "test-7"  "test-8"  "test-9"  "test-10"
str_c("test", 1:10, sep = ",")
## [1] "test,1"  "test,2"  "test,3"  "test,4"  "test,5"  "test,6"  "test,7"  "test,8"  "test,9"  "test,10"

3. NA Replace

str_replace_na() 함수를 이용하면 NA 문자를 제거할 수 있습니다.

str_c(c("My Name", NA, "Jhon"), ".")
## [1] "My Name." NA         "Jhon."   
str_replace_na(c("My Name", NA, "Jhon"), ".")
## [1] "My Name" "."       "Jhon"

4. String Extraction

str_sub() 함수를 이용하면 '시작 위치'와 '끝 위치'를 지정하여 문자를 추출할 수 있습니다. 참고로 위치값 계산에는 공백(space)이 포함됩니다.

str_sub(statement, 1, 5)
## [1] "R"     "is po" "tool"  "for d" "analy"

TIP : 문자열 끝까지 선택하기

문자열 길이를 예측할 수 없는 경우, 아래와 같이 '끝 위치'에 -1을 입력하면 각 문자열의 맨 끝을 지정할 수 있습니다.

아래 예시는 문자열 '4번째 위치'부터 '끝 위치'까지 선택하여 'Wow'라는 문자로 변경하는 코드이며, 출력 결과를 보면 4번째 위치 이후 모든 글자가 'Wow'로 변경된 것을 볼 수 있습니다.

str_sub(statement, 4, -1) <- "Wow"
statement
## [1] "RWow"   "is Wow" "tooWow" "forWow" "anaWow"

5. Split

str_split() 함수는 패턴(pattern)을 이용하여 문자열 분리해주는 함수입니다. 함수 결과는 문자열 리스트(list)별로 패턴(pattern)에 의해 구분되어 저장됩니다.

str_split(statement, pattern = " ")
## [[1]]
## [1] "R"
## 
## [[2]]
## [1] "is"       "powerful"
## 
## [[3]]
## [1] "tool"
## 
## [[4]]
## [1] "for"  "data"
## 
## [[5]]
## [1] "analysis"

6. Subset

패턴(pattern)을 이용하여 문자열 일부를 선택하고 싶다면 str_subset() 함수를 이용하면 됩니다. 아래는 R에서 제공하는 기본 컬러 데이터(color())에서 원하는 컬러를 키워드 검색하는 예시입니다.

str_subset(colors(), pattern = "green")
## [1] "darkgreen"         "darkolivegreen"    "darkolivegreen1"   "darkolivegreen2"   "darkolivegreen3"   "darkolivegreen4"  
## [7] "darkseagreen"      "darkseagreen1"     "darkseagreen2"     "darkseagreen3"     "darkseagreen4"     "forestgreen"      
## [13] "green"             "green1"            "green2"            "green3"            "green4"            "greenyellow"      
## [19] "lawngreen"         "lightgreen"        "lightseagreen"     "limegreen"         "mediumseagreen"    "mediumspringgreen"
## [25] "palegreen"         "palegreen1"        "palegreen2"        "palegreen3"        "palegreen4"        "seagreen"         
## [31] "seagreen1"         "seagreen2"         "seagreen3"         "seagreen4"         "springgreen"       "springgreen1"     
## [37] "springgreen2"      "springgreen3"      "springgreen4"      "yellowgreen"     

문자열 패턴 매칭은 위 예시처럼 키워드로 검색 가능하지만, 아래와 같이 정규표현식 을 이용하여 좀 더 자세한 조건 적용이 가능합니다.

아래 적용된 패턴(pattern)을 설명드리면 ^orange는 'orange'로 시작하는 문자열'을 의미하며, red$는 'red로 끝나는 문자열'을 의미합니다. 이 두 패턴 중간에 파이프(|)는 검색 결과의 합집합을 구한다고 생각하시면 됩니다. (반대로 교집합은 &를 사용하시면 됩니다.)

str_subset(colors(), pattern = "^orange|red$")
## [1] "darkred"         "indianred"       "mediumvioletred" "orange"          "orange1"         "orange2"         "orange3"        
## [8] "orange4"         "orangered"       "orangered1"      "orangered2"      "orangered3"      "orangered4"      "palevioletred"  
## [15] "red"             "violetred"   

아래 예시는 3개 문자열을 가지는 list 변수를 대상으로 문자열 매칭을 수행하는 코드입니다. 아래 적용된 패턴 [a-z]는 '소문자 a부터 z까지를 찾는 패턴'이며, 출력 결과에서 보듯이 각 문자열에서 패턴에 맞는 첫번째 값을 출력하게 됩니다.

list <- c("Hai1", "my 10", "Name 20")
str_extract(list, pattern = "[a-z]")
## [1] "a" "m" "a"

아래 코드에 적용된 패턴 [a-z]+는 위에서 사용한 패턴의 응용으로 '[a-z] 패턴에 매칭되는 문자를 찾고 해당 문자 이후에 나타나는 문자들을 함께 출력하라'는 의미입니다.

str_extract(list, pattern = "[a-z]+")
## [1] "ai"  "my"  "ame"

7. html view

str_view() 함수를 이용하면 문자열에서 패턴에 의해 매칭된 문자를 시각적으로 확인할 수 있습니다. 아래 적용된 패턴 a.a 문자를 찾은 뒤 이후 1개 문자를 함께 출력하라는 의미입니다.

str_view(statement, "a.")

R에서 str_view 동작 결과
▲ 'str_view()' 동작 결과

위 명령어 사용시 아래와 같은 에러가 발생하시는 분은, htmlwidgets 패키지를 추가로 설치하시면 됩니다.

Error: htmlwidgets package required for str_view().
Please install.packages("htmlwidgets") to use this functionality.

install.packages("htmlwidgets")
library(htmlwidgets)

str_view(statement, "a.")

8. Count

str_count() 함수는 문자열 내에 패턴에 해당하는 문자의 개수를 출력해 줍니다. 아래 코드는 statement 데이터에서 a 또는 e 문자의 개수를 카운트하는 예시입니다.

statement
## [1] "R"           "is powerful" "tool"        "for data"    "analysis"
str_count(statement, "[ae]")
## [1] 0 1 0 2 2

9. Location

str_locate() 함수는 문자열 내에 패턴에 해당하는 문자의 위치(시작위치, 끝위치)를 출력해 줍니다. 아래 코드는 statement 데이터에서 a 또는 e 문자의 위치를 찾는 예시로 출력 결과는 패턴으로 검색된 첫번째 문자에 대한 결과입니다.

만약, for data라는 문자열이라면 첫번째 a에 대한 결과만 출력됩니다.

str_locate(statement, "[ae]")
##      start end
## [1,]    NA  NA
## [2,]     7   7
## [3,]    NA  NA
## [4,]     6   6
## [5,]     1   1

TIP : 모든 위치값 찾기

str_locate_all() 함수를 이용하면 패턴에 맞는 모든 문자 위치를 확인할 수 있습니다.

str_locate_all(statement, "[ae]")
## [[1]]
##      start end
## 
## [[2]]
##      start end
## [1,]     7   7
## 
## [[3]]
##      start end
## 
## [[4]]
##      start end
## [1,]     6   6
## [2,]     8   8
## 
## [[5]]
##      start end
## [1,]     1   1
## [2,]     3   3

10. Lower/Upper case

stringr 패키지에서는 영어 문자열에 대한 '대문자 변환', '소문자 변환', '첫글자 대문자 변환' 함수를 제공하고 있습니다.
str_to_lower() 함수는 영어 문자열을 모두 소문자로 변환해 줍니다.

str_to_lower(statement)
## [1] "r"           "is powerful" "tool"        "for data"    "analysis"   

str_to_uppter() 함수는 영어 문자열을 모두 대문자로 변환해 줍니다.

str_to_upper(statement)
## [1] "R"           "IS POWERFUL" "TOOL"        "FOR DATA"    "ANALYSIS"

str_to_title() 함수는 단어의 첫번째 문자를 대문자로 변환해 줍니다.

str_to_title(statement)
## [1] "R"           "Is Powerful" "Tool"        "For Data"    "Analysis"

마무리

stringr 패키지는 R에서 문자열(텍스트) 처리를 지원하는 가장 유용한 패키지 입니다. 주요 기능들이 영어 처리를 목적으로 개발되어 한글 지원이 부족하지만 정규표현식 을 활용한다면 많은 부분들을 해결할 수 있습니다.

관련 링크

[1] Stringr in r 10 data manipulation Tips and Tricks
[2] stringr 패키지 공식 페이지
[3] Wikipedia - 정규표현식


banner-request-analysis