본문 바로가기
R 프로그래밍/R basic

[R데이터다루기]문자열 처리하기(기초)

by 찐남 2021. 10. 5.
본 포스팅은 R for Data Science를 기반으로 작성되었습니다. 

 

1. 소개

 

이번 포스팅에서는 R의 문자열 처리를 소개합니다. 문자열이 작동하는 방식과 손으로 문자열을 만드는 방법에 대한 기본 사항을 배우지만 이번 포스팅의 초점은 정규표현식 또는 줄여서 정규식입니다. 문자열은 일반적으로 비정형 또는 반정형 데이터를 포함하고 있는데, 정규 표현식은 문자열의 패턴을 설명하기 위한 간결한 언어이기 때문에 매우 유용합니다. 정규 표현식을 처음 볼 때 매우 당황할 수 있지만 시간이 지나면 곧 이해하기 시작할 것입니다. 

 

1.1. 전제조건

 

이번 포스팅에서는 핵심 tidyverse의 일부인 문자열 조작을 위한 stringr 패키지에 초점을 맞출 것입니다. 

library(tidyverse)



2. 문자열 기초

 

작은따옴표나 큰따옴표를 사용하여 문자열을 만들 수 있습니다. 다른 언어와 달리 동작에는 차이가 없습니다. 여러 "를 포함하는 문자열을 생성하지 않으려면 항상 "를 사용하는 것이 좋습니다. 

string1 <- "This is a string"
string2 <- 'If I want to include a "quote" inside a string, I use single quotes'

 

따옴표를 닫는 것을 잊은 경우 연속 문자인 +가 표시됩니다. 

> "This is a string without a closing quote


+ HELP I'M STUCK

이런 일이 발생하면 당황하지 마시고, Esc 키를 누르고 다시 시도하시면 됩니다. 

 

문자열에 작은따옴표나 큰따옴표를 포함하려면 \(역슬래쉬)를 사용하여 "이스케이프"할 수 있습니다. 

double_quote <- "\"" # or '"'
single_quote <- '\'' # or "'"

 

즉,  역슬래쉬를 포함하려면 "\\"를 두 번 입력해야 합니다. 

 

문자열에 인쇄된 표현은 문자열 자체와 동일하지 않습니다. 문자열에서 출력되는 형태를 보려면 writeLines()를 사용하시면 됩니다. 

x <- c("\"", "\\")
x
#> [1] "\"" "\\"
writeLines(x)
#> "
#> \

 

다른 특수 문자도 있습니다. 가장 일반적인 것은 "\n"(줄 바꿈) 및 "\t"(탭)이지만 ", ?'"' 또는 ?"'"를 입력해서 이에 대한 자세한 전체 목록을 볼 수 있습니다. 또한 "\u00b5"와 같은 문자열을 볼 수도 있습니다. 이는 모든 플랫폼에서 작동하는 비영어 문자를 작성하는 방법입니다.

x <- "\u00b5"
x
#> [1] "µ"

 

여러 문자열은 종종 c()로 생성할 수 있는 문자형 벡터에 저장됩니다.

c("one", "two", "three")
#> [1] "one" "two" "three"



2.1. 문자열 길이

 

Base R에는 문자열로 작업할 수 있는 많은 함수가 포함되어 있지만 일관성이 없어 기억하는 데에 어려움이 많습니다. 대신 stringr의 함수를 사용할 것입니다. stringr은 더 직관적인 이름을 가지며 모두 str_으로 시작합니다. 예를 들어 str_length()는 문자열의 문자 수를 알려줍니다.

 

str_length(c("a", "R for data science", NA))
#> [1] 1 18 NA

 

일반적인 str_ 접두사는 RStudio를 사용하는 경우 특히 유용합니다. str_을 입력하면 자동 완성이 트리거 되어 모든 stringr 함수를 볼 수 있기 때문입니다. 

 

2.2. 문자열 결합

 

두 개 이상의 문자열을 결합하는데 유용한 str_c() 함수가 있습니다.

str_c("x", "y")
#> [1] "xy"
str_c("x", "y", "z")
#> [1] "xyz"

 

sep 인수를 사용하여 결합 방법을 제어할 수 있습니다.

str_c("x", "y", sep = ", ")
#> [1] "x, y"

 

결측값을 "NA"로 인쇄하려면 str_replace_na()를 사용하시면 됩니다.

x <- c("abc", NA)
str_c("|-", x, "-|")
#> [1] "|-abc-|" NA
str_c("|-", str_replace_na(x), "-|")
#> [1] "|-abc-|" "|-NA-|"

위와 같이 str_c()는 벡터화되고 짧은 벡터를 가장 긴 벡터와 같은 길이로 자동 재활용합니다.

 

str_c("prefix-", c("a", "b", "c"), "-suffix")
#> [1] "prefix-a-suffix" "prefix-b-suffix" "prefix-c-suffix"

 

길이가 0인 개체는 자동으로 삭제됩니다. 이는 if와 함께 특히 유용합니다.

name <- "Hadley"
time_of_day <- "morning"
birthday <- FALSE
str_c(
____"Good ", time_of_day, " ", name,
____if (birthday) " and HAPPY BIRTHDAY",
____"."
)
#> [1] "Good morning Hadley."

 

문자열 벡터를 단일 문자열로 축소하려면 collapse를 사용하시면 됩니다.

str_c(c("x", "y", "z"), collapse = ", ")
#> [1] "x, y, z"



2.3. 문자열 부분 집합

 

str_sub()를 사용하여 문자열의 일부를 추출할 수 있습니다. 문자열뿐만 아니라 str_sub()는 하위 문자열의 (포함) 위치를 제공하는 시작 및 끝 인수를 필요로 합니다.

 

x <- c("Apple", "Banana", "Pear")
str_sub(x, 1, 3)
#> [1] "App" "Ban" "Pea"

# 음수는 끝에서부터 거꾸로 셉니다.
str_sub(x, -3, -1) #> [1] "ple" "ana" "ear"

 

문자열이 짧아도 str_sub()가 실패하지 않습니다. 

str_sub("a", 1, 5)
#> [1] "a"

 

str_sub()의 할당 형식을 사용하여 문자열을 수정할 수도 있습니다.

str_sub(x, 1, 1) <- str_to_lower(str_sub(x, 1, 1))
x
#> [1] "apple" "banana" "pear"

 

2.4. Locale

 

위에서 str_to_lower()를 사용하여 텍스트를 소문자로 변경했습니다. str_to_upper() 또는 str_to_title()을 사용할 수도 있습니다. 그러나 대소문자를 바꾸는 것은 언어마다 대소문자를 바꾸는 규칙이 다르기 때문에 처음 나타나는 것보다 더 복잡합니다. locale을 지정하여 사용할 규칙 세트를 선택할 수 있습니다.

 

# 터키어에는 점이 있는 것과 없는 것의 두 가지 i가 있습니다.
# 대문자 사용에 대한 다른 규칙이 있습니다.
str_to_upper(c("i", "ı"))
#> [1] "I" "I"
str_to_upper(c("i", "ı"), locale = "tr")
#> [1] "İ" "I"

 

locale은 ISO 639 언어 코드로 지정되며 이는 두 글자 또는 세 글자로 된 약어입니다. 귀하의 언어 코드를 아직 모른다면 Wikipedia에 좋은 목록이 있습니다. locale을 공백으로 두면 운영 체제에서 제공하는 현재 locale이 사용됩니다. 

 

locale의 영향을 받는 또 다른 중요한 작업은 정렬입니다. 기본 R order() 및 sort() 함수는 현재 locale을 사용하여 문자열을 정렬합니다. 다른 컴퓨터에서 다른 동작을 원하면 추가 로케일 인수를 사용하는 str_sort() 및 str_order()를 사용할 수 있습니다.

 

x <- c("apple", "eggplant", "banana")
str_sort(x, locale = "en") # English
#> [1] "apple" "banana" "eggplant"
str_sort(x, locale = "haw") # Hawaiian
#> [1] "apple" "eggplant" "banana"

 

 



반응형

댓글