May, 2018

R text function

문자열 처리함수

paste 함수

  • 문자열을 합치는 함수
paste("감자로","만든","감자칩", sep='-')
## [1] "감자로-만든-감자칩"
paste("감자로","만든","감자칩", sep='')
## [1] "감자로만든감자칩"
paste("감자로","만든","감자칩")
## [1] "감자로 만든 감자칩"

문자열 처리함수

paste 함수

  • 벡터화 연산의 응용
paste(c("감자로 만든","고구마로 만든"), c("감자칩", "고구마칩"), sep=' ')
## [1] "감자로 만든 감자칩"     "고구마로 만든 고구마칩"
paste0(1:12, c("st", "nd", "rd", rep("th", 9)))
##  [1] "1st"  "2nd"  "3rd"  "4th"  "5th"  "6th"  "7th"  "8th"  "9th"  "10th"
## [11] "11th" "12th"

문자열 처리함수

paste 함수

  • collapse 옵션의 사용
paste0(1:12, collapse = "-")
## [1] "1-2-3-4-5-6-7-8-9-10-11-12"
paste(1:4,5:8, sep = ';')
## [1] "1;5" "2;6" "3;7" "4;8"
paste(1:4,5:8, sep = ';', collapse = '-')
## [1] "1;5-2;6-3;7-4;8"

문자열 처리함수

grep 함수

  • 문자열에 패턴(단어)가 포함되어 있는지를 확인하는 함수임. 패턴이 포함되어 있으면 TRUE, 그렇지 않으면 FALSE를 반환함.
grep("pole", c("Equator", "North Pole", "South pole", "poles"))
## [1] 3 4

nchar 함수

  • 문자열의 단어 개수를 계산해주는 함수
nchar(c("South Pole", "한글 문자열", NA))
## [1] 10  6 NA

문자열 처리함수

substr 함수

  • 문자열 내에서 위치를 참조하여 문자열을 반환하는 함수
substr("Equator", start=2, stop=4)
## [1] "qua"
substr("한글 문자열 추출", start=2,stop=4)
## [1] "글 문"
substring("한글 문자열 추출", first=2)
## [1] "글 문자열 추출"

문자열 처리함수

substr 함수

  • 문자열 내에서 위치를 참조하여 문자열을 반환하는 함수

  • 참고 substr("한글 문자열 추출", start=2)은 실행되지 않는다.

문자열 처리함수

strsplit 함수

  • 문자열을 지정한 문자로 분리시켜주는 함수
strsplit("6-16-2011", split = '-')
## [[1]]
## [1] "6"    "16"   "2011"
  • 특수문자를 이용한 분리
strsplit("6*16*2011", split = '*')
## [[1]]
## [1] "6" "*" "1" "6" "*" "2" "0" "1" "1"

문자열 처리함수

strsplit 함수

  • 문자열을 지정한 문자로 분리시켜주는 함수

  • 여기서 *기호는 모든 문자를 의미한다. *를 문자 하나로 보고 싶은 경우 다음과 같은 두 가지 방법을 사용할 수 있다.

strsplit("6*16*2011", split = '*', fixed = TRUE)
## [[1]]
## [1] "6"    "16"   "2011"
strsplit("6*16*2011", split = '\\*')
## [[1]]
## [1] "6"    "16"   "2011"

문자열 처리함수

strsplit 함수

  • 문자열을 지정한 문자로 분리시켜주는 함수
  • 특수 문자: . $ ^ { [ ( | ) * + ? \ 문자들은 패턴으로 표현된 문자열 내에서 하나의 문자의 기능을 하지 못하고 어떤 표현을 만들어 내는 특수기호로 사용된다.
  • 특별히 어떤 이스케이프 문자를 하나의 문자처름 취급하기 위해서는 위해서는 \\ 기호를 사용한다. 예를 들어 \\*는 하나의 문자열 *를 표현하는 것이다.
  • 문자 이스케이프: 특수기호와 함께 문자열 내에서 특별한 의미를 가지는 문자열 ('\t': 탭, '\n':줄바꿈문자. '\d':숫자)
  • 특별히 strsplit함수의 옵션인 fixed = TRUE는 이스케이프 문자를 허용하지 않겠다는 뜻이다.

문자열 처리함수

strsplit 함수

  • 문자열을 지정한 문자로 분리시켜주는 함수

  • list.files 함수를 이용하여 어떤 폴더내의 파일 이름을 읽고 파일의 이름과 확장자를 분리해 보아라.

문자열 처리함수

regexpr 함수

  • 문자열내에서 지정한 패턴(문자)과 처음으로 일치한 위치를 알려주는 함수
regexpr("감자", "맛있는 감자칩")
## [1] 5
## attr(,"match.length")
## [1] 2

문자열 처리함수

regexpr 함수

  • 문자열내에서 지정한 패턴(문자)과 처음으로 일치한 위치를 알려주는 함수

  • attr함수를 이용해 regexpr 결과 값의 attribute 값을 확인할 수 있다.

a <- regexpr("감자", "맛있는 감자칩")
attr(a, 'match.length')
## [1] 2
attr(a, 'useBytes')
## NULL

문자열 처리함수

gregexpr 함수

  • 문자열내에서 지정한 패턴(문자)과 일치한 모든 위치를 알려주는 함수

  • 출력값이 list 자료형이다.

  • 역시 attr함수를 이용해 gregexpr 결과 값의 attribute 값을 확인할 수 있다.

문자열 처리함수

gregexpr 함수

a <- gregexpr("감자", "머리를 감자마자 감자칩을 먹었다.")
a
## [[1]]
## [1]  5 10
## attr(,"match.length")
## [1] 2 2
attr(a[[1]], 'match.length')
## [1] 2 2

문자열 처리함수

gsub 함수

  • 어떤 패턴에 해당하는 문자열을 정해진 문자열로 대치하는 함수
gsub(pattern = "감자", replacement='고구마',
     x= "머리를 감자마자 감자칩을 먹었다.")
## [1] "머리를 고구마마자 고구마칩을 먹었다."
gsub(pattern = "<br>", replacement='',
     x= "머리를 감자마자 <br>감자칩을 먹었다.")
## [1] "머리를 감자마자 감자칩을 먹었다."

정규표현식

정규표현식

OR

  • 정규표현식은 문자열의 패턴을 만들어준다.
  • 예를 들어 '감자, 고구마, 양파 그리고 파이어볼' 이라는 문자열을 쉼표와 접속사인 '그리고' 를 이용해 분할하고자 한다.
  • OR 연산자인 |를 이용해 아래와 같이 적용할 수 있다.
  • 문자열을 한나로 취급하기 위해서 ()를 사용한다.
strsplit('감자, 고구마, 양파 그리고 파이어볼', split ='(,)|(그리고)')
## [[1]]
## [1] "감자"      " 고구마"   " 양파 "    " 파이어볼"

정규표현식

시작

  • 생성 패턴: 처음에 ~로 시작하는 문자열
  • 기호는 ^를 사용한다.
grep(pattern = '^(감자)', x = '감자는 고구마를 좋아해')
## [1] 1
grep(pattern = '^(감자)', x = '고구마는 감자를 안 좋아해')
## integer(0)

정규표현식

  • 생성 패턴: : ~로 끝나는 문자열
  • 기호는 @를 사용한다.
grep(pattern = '(좋아해)$', x = '감자는 고구마를 좋아해')
## [1] 1
grep(pattern = '(좋아해)$', x = '고구마는 감자를 안 좋아해')
## [1] 1

정규표현식

Any

  • 생성 패턴: 이중에 어느 하나라도 해당하는 문자열
  • 기호는 []를 사용한다.
gregexpr(pattern = '[아자차카]', text = '고구마는 감자를 안 좋아해')
## [[1]]
## [1]  7 13
## attr(,"match.length")
## [1] 1 1

정규표현식

Any

gregexpr(pattern = '[(사과)(감자)(양파)]', text = '고구마는 감자를 안 좋아해')
## [[1]]
## [1] 6 7
## attr(,"match.length")
## [1] 1 1
gregexpr(pattern = '^[(사과)(감자)(양파)]', text = '고구마는 감자를 안 좋아해')
## [[1]]
## [1] -1
## attr(,"match.length")
## [1] -1

정규표현식

everything except

  • 생성 패턴: 다음을 제외한 나머지 중 어느 하나라도 해당하는 문자열
  • [^]를 사용한다. (bracket 안쪽에 hat과 바깥쪽의 hat을 구별하여라.)
grep(pattern = '^[^(사과)(감자)(양파)]', x = '감자는 고구마를 좋아해')
## integer(0)

정규표현식

abbreviation

  • [a-z] 알파벳 소문자 이외의 문자 중 아무것이나 1개
  • [A-Z] 알파벳 대문자 이외의 문자 중 아무것이나 1개
  • [0-9] 숫자 이외의 문자 중 아무것이나 1개
  • [a-zA-Z] 알파벳 소문자나 대문자 중 아무것이나 1개
  • [가-힣] 한글중에 아무거나 1개
  • [^가-힣]

정규표현식

abbreviation in []

  • [:alpha:] 알파벳 문자

  • [:lower:] 소문자 알파벳 문자

  • [:upper:] 대문자 알파벳 문자

  • [:digit:] 숫자

  • [:alnum:] 알파벳/숫자

  • [:space:] 출력되지 않는 공백 문자(예: carriage return, newline, vertical tab, form feed 등

  • [:punct:] 구두점 기호

  • [:cntrl:] (출력되지 않는) 컨트롤 문자

정규표현식

반복

  • 생성 패턴: 어떤문자가 일정수 반복되는 문자열
  • {from,to} 를 이용하여 생성. 바로 앞 문자에 대한 패턴임을 주의!
  • o{2,4} 는 문자 o가 2번에서 4번까지 반복되는 패턴
  • [a-z]{3,6} 영어 소문자가 3번에서 6번까지 반복되는 패턴
  • {5} 는 5번 {5,} 5번 이상 반복을 뜻함.

정규표현식

반복

  • ^ab{2,3}: 시작은 a로 시작하고 다음 b가 2번에서 3번까지 반복되는 패턴
grep(pattern = '^ab{2,3}', x = 'ab')
grep(pattern = '^ab{2,3}', x = 'abab')
grep(pattern = '^ab{2,3}', x = 'abbb')
grep(pattern = '^(ab){2,3}', x = 'abab')

정규표현식

abbreviation in {,}

  • *: {0,}
  • +: {1,}
  • ?: {0,1}
  • .: 어떠한 문자라도 1개

정규표현식

예제

^[1-9][0-9]*$
  • ^[1-9] 처음은 1에서 9로 시작하고
  • [0-9]* 그 다음은 숫자들이 올 수도 있고 반복될 수도 있는데
  • $ 그것으로 끝나는 패턴

정규표현식

예제

^[1-9][0-9]*$
  • ^[1-9] 처음은 1에서 9로 시작하고
  • [0-9]* 그 다음은 숫자들이 올 수도 있고 반복될 수도 있는데
  • $ 그것으로 끝나는 패턴

정규표현식

예제

^(0|([1-9][0-9]*))$
  • ^()$ 괄호 안에 있는 문자열로 시작해서 끝나는 패턴
  • 0|() 0이거나 괄호안에 문자열
^[0-9]+(\\.[0-9]{1,2})?$
  • ^[0-9]+ 숫자가 없거나 혹은 1번이상 반복으로 시작하는 문자열
  • ()? 괄호안의 문자열이 없거나 한번 반복되는 문자열
  • \\.[0-9]{1,2} . 으로 시작해서 숫자가 1번에서 두번까지 반복되는 문자열

정규표현식

예제

^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*$
  • 시작과 끝을 확인하여라.
  • jj-.__.jeon@gmail.kr.com은 생성된 패턴에 포함되나?
  • jj,jeon@gmail.com은 생성된 패턴에 포함되나?

stringr package

stringr package

  • 문자열 다양한 문자열 처리 함수를 제공
  • 일관성 있는 함수 이름

stringr 함수

  • str_sub: substr, substring
  • str_c: paste, paste0
  • str_split; strsplit
  • str_detect: grep
  • str_count: regexpr, gregexpr
  • str_locate: regexpr, gregexpr

stringr package

stringr 함수

  • str_extract, str_extract_all: regexpr + substring
  • str_replace: regexpr + gsub

stringr package

str_sub

  • 문자열의 특정부분을 참조
if(!require(stringr)){install.packages("stringr"); library(stringr)}
## Loading required package: stringr
hw <- "Hadley Wickham"
str_sub(hw, 1, 6)
## [1] "Hadley"
str_sub(hw, -5)
## [1] "ckham"
str_sub(hw, -5, -2)
## [1] "ckha"

stringr package

str_split

  • 문자열 나누기
fruits <- c("apples and oranges and pears and bananas",
    "pineapples and mangos and guavas")
str_split(fruits, " and ")
## [[1]]
## [1] "apples"  "oranges" "pears"   "bananas"
## 
## [[2]]
## [1] "pineapples" "mangos"     "guavas"

stringr package

str_split

  • 문자열 분할시 최대 개수를 지정해줄 수 있다.
str_split(fruits, " and ", n = 2)
## [[1]]
## [1] "apples"                        "oranges and pears and bananas"
## 
## [[2]]
## [1] "pineapples"        "mangos and guavas"

stringr package

str_split

  • fixed 옵션을 통해서 행렬로 저장 가능하다.
str_split_fixed(fruits, " and ", 4)
##      [,1]         [,2]      [,3]     [,4]     
## [1,] "apples"     "oranges" "pears"  "bananas"
## [2,] "pineapples" "mangos"  "guavas" ""

stringr package

str_detect

  • 매치하는 곳이 있는지 없는지를 logical 값으로 돌려줌.
fruit <- c("apple", "banana", "pear", "pinapple")
str_detect(fruit, "^a")
## [1]  TRUE FALSE FALSE FALSE

stringr package

str_detect

  • 매치하는 곳의 수를 돌려줌
str_count(fruit, c("a", "b", "p", "p"))
## [1] 1 1 1 3

stringr package

str_locate

  • 처음으로 매치되는 곳의 start, end 위치를 행렬로 돌려줌.
str_locate(fruit, "e")
##      start end
## [1,]     5   5
## [2,]    NA  NA
## [3,]     2   2
## [4,]     8   8

stringr package

str_extract, str_extract_all

  • 매치된 부분 문자열을 추출. 매치되지 않은 요소는 NA를 반환
shopping_list <- c("apples x4", "flour", "sugar", "milk x2")
str_extract(shopping_list, "\\d")
## [1] "4" NA  NA  "2"

stringr package

str_replace

  • 매치되지 않은 부분은 그대로 매치된 부분만 치환함
fruits <- c("one apple", "two pears", "three bananas")
str_replace(fruits, "[aeiou]", "-")
## [1] "-ne apple"     "tw- pears"     "thr-e bananas"