문자 편집 패키지 stringr를 이용하여 문자 데이터를 편집해보겠습니다.


stringr 패키지

stringr 패키지를 불러와서 실행시킵니다.

install.packages('stringr')
library(stringr)


str_detect

문자열 패턴 확인 함수로 SQL에서 like 연산자와 같은 기능을 합니다. 첫번째 인자에 벡터를 입력하고 두번째 인자에는 정규 표현식의 패턴을 입력하는 방식으로 사용합니다.

v1 <- c('abc','a2bcd','bcd','aaaaa')
str_detect(v1, 'a')     # a 포함시 True
str_detect(v1, '^a')    # a로 시작시 True
str_detect(v1, 'a$')    # a로 끝날시 True
str_detect(v1, '^[aA]') # a또는 A로 시작하는 지 확인
str_detect(v1, '^[aA][bB]') # [] 순서대로 1번째, 2번째 글자 구분
str_detect(v1, '^[aAb]') # a or A or b
str_detect(v1, '^.b')   # 2번째 글자가 b인지 확인
str_detect(v1, '[0-9]') #숫자를 포함하는
str_detect(v1, '[:digit:]') #숫자 포함
str_detect(v1, '[a-zA-Z]') #영문 포함
str_detect(v1, '[:alpha:]') #문자 포함
str_detect(v1, '[:punct:]') #특수문자 포함
str_detect(v1, 'a{4,5}') #a가 4회 이상 5회 이하 반복

아래에서 처럼 데이터 프레임에서 조건 색인을 하는 경우에도 사용할 수 있습니다.

eg) student.csv 읽고 id에 ‘a’를 포함하는 학생의 이름, id, 학년 출력

std <- read.csv('student.csv', stringsAsFactors = F)
std[str_detect(std$ID, 'a') ,c('NAME','ID','GRADE')]

str_count

문자열에 포함되어 있는 패턴의 개수를 출력하는 함수로 정규 표현식 사용이 가능합니다.

str_count(v1, 'a')
str_count(v1, '^[aA]')
str_count(v1, '[0-9]')

str_c

문자열 결합 함수로 SQL에서 연결 연산자(||)와 비슷한 기능을 가지고 있습니다. sep 옵션에는 결합시 전달할 구분자를 입력하는데, 같은 위치의 값들끼리 합쳐지게 됩니다. collapse 옵션도 결합시 전달할 구분자 입력하는데 하나의 값으로 합쳐지게 됩니다.

v3 <- c('a','b','c')
v4 <- c('A','B','C')
str_c('a','b','c',sep = ';')
str_c(v3,sep = ';')   #'a','b','c' 결합불가
str_c(v3, collapse = ';')
str_c('a','b','c')
str_c(v3,v4)
str_c(std$NAME, collapse = '')
str_c(v3,' is...') # v3||' is....'

eg) emp.csv 파일을 읽고 아래와 같은 형식으로 출력

SMITH의 10% 인상된 연봉은 880이다

emp <- read.csv('emp.csv',stringsAsFactors = F)

str_c(emp$ENAME,'의 10% 인상된 연봉은 ',emp$SAL * 1.1,'이다.')

eg) student.csv 읽고 id에 숫자가 2회이상 반복된 학생 데이터 제외

std <- std[str_count(std$ID,'[0-9]') < 2,]

std <- std[!str_detect(std$ID,'[0-9]{2}'),]

str_count(std$ID,'[0-9]') >= 2 # 불가, 단순포함
str_detect(std$ID,'[0-9]{2}')  # 가능, 연속반복
str_detect(std$ID,'[0-9][0-9]')# 가능

str_length

문자열의 크기 출력하는 함수로 SQL의 length 함수와 같습니다.

v1 <- c('abc','a2bcd','bcd','aaaaa')
str_length(v1)

str_locate

문자열이나 패턴의 위치를 출력하는 함수로 SQL에서 INSTR 함수와 동일합니다.

v6<- c('a#b#c','a##b##c##')

str_locate(v6,'#')     #첫번째 #의 위치 출력
str_locate_all(v6,'#') #모든 원소의 #의 모든 위치 출력
str_locate('abc','ab') #찾는 문자열의 시작, 끝 위치 다른 경우

str_sub

위치기반 문자열 추출 함수로 SQL에서 SUBSTR 함수랑 비슷하나 세번째 인자를 주의해서 입력해야합니다. 두번째 인자에는 음수 입력이 가능합니다.

str_sub(v6,2,3) #위치 2부터 위치 3까지의 문자열 추출
substr(v6,2,3)

eg) ‘031-356-1234’에서 국번 추출, 단 위치 기반으로

str_sub('031-356-1234', 1,
        str_locate('031-356-1234','-')[1,1]-1)

str_replace

문자열 치환 함수로 기존 문자를 새로운 문자로 바꾸는 기능으로 SQL에서 REPLACE 함수와 비슷합니다. 단, 기존 문자와 새로운 문자의 데이터 형은 일치해야하며 NA로 또는 NA를 치환하는 것은 불가능합니다.

str_replace('abc','a','A')
str_replace('abca','ab','AB') 
str_replace('abca','ab','')

str_replace('abca','a','')
str_replace_all('abca','a','')

#
v7 <- c('ab',NA,'BC')
str_replace(v7, NA, 0)  # NA를 치환불가
str_replace(v7,'ab',NA) # NA로 치환불가
str_replace('ab','a',0) #문자 이외값으로 치환 불가

eg) 다음 변수의 10% 인상된 값을 출력하시오.

v_sal <- c('1,200','5,000','3,300')

v_sal <- as.numeric(str_replace(v_sal,',',''))*1.1 ;v_sal

v_sal <- as.numeric(str_replace_all(v_sal,',',''))*1.1 ;v_sal

str_split

문자를 구분자 기준으로 분리하는 함수로 str_c와 반대되는 역할을 가지고 있습니다. 출력결과가 리스트이기 때문에 분리 후 색인시 주의하셔야합니다.

str_split('a#b#c','#')
[[1]]
[1] "a" "b" "c"

str_split('a#b#c','#')[[1]][2]
[1] "b"