해당 포스트에서는 R에서 텍스트(문자) 데이터 처리를 위한 10가지 Tip and Tricks 를 소개합니다.
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.")
위 명령어 사용시 아래와 같은 에러가 발생하시는 분은, 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 - 정규표현식