티스토리 뷰
정규 표현식
정규 표현식은 방대한 데이터에서 원하는 정보만 추출하고 싶을 때 유용하게 사용됩니다.
파이썬에서도 동일하게 적용되니까 알아두면 두루두루 잘 사용할 수 있겠죠!?
1. grep() 함수 : 특정 패턴만 골라내기
grep(패턴, 문자열)
stringr 패키지의 str_detect() 함수와 비슷하지만, 인자 부분이 다르죠?
grep 함수는 탐색할 대상을 두 번째 인자에 넣어줍니다.
> library(stringr)
> v1 <- c('abc', 'abc1', 'Acacia', 'banana', 'carrot', 'Avocado')
# str_detect 함수는 TRUE or FALSE 리턴
> str_detect(v1, 'ab')
[1] TRUE TRUE FALSE FALSE FALSE FALSE
> v1[str_detect(v1, 'ab')]
[1] "abc" "abc1"
# grep 함수는 패턴 위치를 리턴(동일한 결과)
> grep('ab', v1)
[1] 1 2
> v1[grep('ab', v1)]
[1] "abc" "abc1"
> grep('ab', v1, value = T) # 참고. value =T 옵션은 패턴에 해당되는 값을 직접 추출(색인을 하지 않아도 자동으로 값 출력)
[1] "abc" "abc1" # 벡터 데이터 추출 시 주로 사용합니다.
# v1에서 ab 또는 ba를 포함하는 값 출력(두 가지 패턴을 동시에 찾는 방법)
> v1
[1] "abc" "abc1" "Acacia" "banana" "carrot" "Avocado"
> pattern <- c('ab', 'ba')
> grep(pattern, v1) # pattern은 2개 이상의 값을 가질 수 없습니다.
[1] 1 2
Warning message:
In grep(pattern, v1) :
argument 'pattern' has length > 1 and only the first element will be used
> grep('ab|ba', v1) # ' | ' 연산자로 하나의 값으로 묶어서 전달(or 패턴 검사 가능)
[1] 1 2 4
> grep(paste(pattern, collapse = '|'), v1, value = T)
[1] "abc" "abc1" "banana"
> v1
[1] "abc" "abc1" "Acacia" "banana" "carrot" "Avocado"
> grep('^c',v1,value=T) # c로 시작하는 단어 찾기
[1] "carrot"
> grep('a$',v1,value=T) # a로 끝나는 단어 찾기
[1] "Acacia" "banana"
> grep('[1-9]',v1,value=T) # 숫자가 포함된 단어 찾기
[1] "abc1"
> grep('[[:upper:]]',v1,value=T) # 대문자가 포함된 단어 찾기
[1] "Acacia" "Avocado"
2. nchar() 함수 : 원소의 크기 리턴
nchar() 함수는 str_length() 함수와 유사합니다.
> v1
[1] "abc" "abc1" "Acacia" "banana" "carrot" "Avocado"
> nchar(v1)
[1] 3 4 6 6 6 7
> nchar('배고파')
[1] 3
3. paste() 함수 : 문자열 결합
paste() 함수는 str_c() 함수와 유사합니다.
# 나열된 문자들의 결합
> paste('a', 'b', 'c') # paste함수에 나열된 문자들을 하나로 결합
[1] "a b c"
# 결합 시 구분기호는 공백(default)
> paste('a', 'b', 'c', sep='') # 공백 제거
[1] "abc"
> paste('a', 'b', 'c', sep='/') # 구분기호 지정
[1] "a/b/c"
> paste('I','\'m', 'Aaron') # 특수문자의 경우 \ 사용
[1] "I 'm Aaron"
# sep 옵션과 collapse 옵션의 차이점을 명확하게 알아야 합니다.
# 나열된 문자들의 결합
> paste('a', 'b', 'c', sep='|') # sep은 분리되어진 각 문자의 구분 기호( | ) 지정 가능
[1] "a|b|c"
> paste('a', 'b', 'c', collapse='|') # collapse는 분리되어진 각 문자의 구분 기호( | ) 지정 불가
[1] "a b c"
> # 벡터 데이터의 결합
> vv1 <- c('a', 'b', 'c')
> paste(vv1, sep='|') # sep은 벡터 내 원소의 구분 기호( | ) 지정 불가
[1] "a" "b" "c"
> paste(vv1, collapse ='|') # collapse는 벡터 내 원소의 구분 기호( | ) 지정 가능
[1] "a|b|c"
결론으로,
sep 옵션은 나열된 문자들을 결합 구분 기호로 결합하고 싶을 때 사용하고,
collapse 옵션은 벡터 내 요소들을 구분 기호로 결합하고 싶을 때 사용합니다.
4. substr() 함수 : 문자열 추출
substr(문자열, 시작위치, 끝나는 위치 )
> substr('i\'m hungry',3,3)
[1] "m"
> substr('i\'m hungry',5,10)
[1] "hungry"
5. strsplit() 함수 : 문자열 분리
strsplit(문자열, split = 기준문자)
> strsplit('2019/01/02', split = '/')
[[1]]
[1] "2019" "01" "02"
6. regexpre() 함수 : 정규식 표현을 사용한 패턴 검색
regexpre(패턴, 문자열)
> regexpr( ',', '100,000,000' ) # 처음으로 나오는 패턴의 위치 출력
[1] 4
attr(,"match.length")
[1] 1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE
# grep() 함수로는 문자열의 위치를 찾을 수 없습니다.
> grep(',','100,000,000')
[1] 1 # 출력되는 1은 패턴이 포함된 '1'번째 문자열을 의미
> grep(',',c('100,000', '10', '100', '100,000'))
[1] 1 4 # '1', '4' 번째 문자열에 특정 패턴이 있다는 의미
Q.
# 1. emp 데이터를 사용, 사원번호가 79로 시작하는 직원의 연봉(SAL + COMM) 평균을 구하여라
> emp
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7369 SMITH CLERK 7902 1980-12-17 0:00 800 NA 20
2 7499 ALLEN SALESMAN 7698 1981-02-20 0:00 1600 300 30
...
13 7902 FORD ANALYST 7566 1981-12-03 0:00 3000 NA 20
14 7934 MILLER CLERK 7782 1982-01-23 0:00 1300 NA 10
> sal_79 <- emp[grep('^79', emp$EMPNO), c("SAL","COMM")] # 색인에서 연산 불가(추출만 가능)
> mean(sal_79$SAL + ifelse(is.na(sal_79$COMM),0,sal_79$COMM)) # mean 함수는 벡터 내의 원소들끼리의 평균을 구해주도록 설계
[1] 1750
# 2. professor 데이터를 사용, ID에 특수문자가 포함되어 있는 직원의 이름과 id 출력
> professor <- read.csv("professor.csv", stringsAsFactors = F)
> professor
PROFNO NAME ID POSITION PAY HIREDATE BONUS DEPTNO EMAIL HPAGE
1 1001 조인형 captain 정교수 550 1980/06/23 00:00:00 100 101 captain@abc.net http://www.abc.net
2 1002 박승곤 sweety 조교수 380 1987/01/30 00:00:00 60 101 sweety@abc.net http://www.abc.net
...
15 4006 전민 napeople 전임강사 220 2010/06/28 00:00:00 NA 301 napeople@jass.com
16 4007 허은 silver-her 조교수 290 2001/05/23 00:00:00 30 301 silver-her@daum.net
> professor[grep('[[:punct:]]',professor$ID),c("NAME","ID")]
NAME ID
9 김현정 only-u
16 허은 silver-her
# 3. 특수문자가 포함된 ID의 특수문자 제거
> library(stringr)
> professor$ID <- str_replace_all(professor$ID, '[[:punct:]]', '')
> professor$ID
[1] "captain" "sweety" "powerman" "lamb1" "number1" "bluedragon" "angel1004" "naone10" "onlyu"
[10] "simson" "gogogo" "mypride" "ironman" "standkang" "napeople" "silverher"
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Process' 카테고리의 다른 글
[R] 함수의 정의 (0) | 2019.01.02 |
---|---|
[R] 연산 (0) | 2019.01.02 |
[R] 문자열 관련 함수 - stringr 패키지, 정규식 (1) | 2019.01.01 |
[R] 반복문 - for, while, next, repeat, exit, break (2) | 2019.01.01 |
[R] 조건문 - if, else if, ifelse (0) | 2018.12.31 |