본문 바로가기

배우기/복습노트[R과 분석]

[복습] R(programming language) 문자열 함수 정리하기 + 복습후기(20231122)

728x90
반응형

이 연습에서는 stringr 패키지를 사용하였다.

install.packages('stringr') 로 패키지 설치 후 library(stringr)로 로드하였다.

 

문자열 함수에 본격적으로 들어가기 전에 중요 패키지 내부 함수 목록 보는 팁을 설명하겠다.

 

 

이렇게 stringr:: 처럼 콜론을 두 번 붙이면 stringr 패키지의 내부 함수를 볼 수 있다.

그런데 분석기사 시험장에는 자동완성이 되지 않는다.

옵션과 함수명을 다 외워야 하고 팝업도 뜨지 않는다.

그럴 때에는 ls('package:stringr') 로 찾아볼 수 있다.

 

 

ls('package:base') 하면 모든 패키지의 목록이 다 나온다.

 

따라서 stringr:: 또는 ls() 를 사용하면 될 것이다.

 

 

본격적으로 문자열 함수를 정리해보자.

 

1. 대소치환

string_to_lower()

string_to_upper()

string_to_title()

 

위에서부터 차례로 소문자 치환, 대문자 치환, 카멜표기법이다.

 

2. 문자 추출

str_sub()

str_sub까지 r studio에 입력하면 str_sub 사용방법이 뜬다.

str_sub(string = , start = 1, end = -1) 

이렇게 뜨는데, end의 마이너스 의미는 끝까지 라는 뜻이다.

str_sub(string =   ,     #문자열

              start = 1,      #시작위치

              end = -1 )     # 끝위치

이런 포맷이다.

 

예를 들어 emp 테이블의HIREDATE 컬럼에서 입사월을 추출하여보자.

 

SQL과는 옵션이 조금 다르다

sql은 두 번째 위치가 추출하려는 시작위치, 세 번째 위치가 추출하려는 시작 위치로부터 몇 개를 추출할 것인지를 의미하는데 R에서의 str_sub는 추출 시작하는 위치와 추출할 위치까지 넣는다.

마이너스를 넣으면 거꾸로 시작하여 정방향으로 추출된다.

 

3. 치환

str_replace(string =  ,          # 대상

                   pattern = ,         # 찾을 문자열(문자만 전달 가능)

                   replacement = ) # 바꿀 문자열(문자만 전달 가능)

 

Line 1은 T를 X로 치환하였고, Line 2는 T를 제거하였다.

그런데 SCOTT의 경우 T가 두 개인데 하나만 남은 것을 확인할 수 있다.

그래서 이 때에는 str_replace_all 함수를 사용하면 된다. 모두 제거된 것을 확인할 수 있다.

 

지금 소개하는 모든 함수들은 문자열 함수이기 때문에 문자 외에는 어떠한 것도 올 수가 없다.

Line1과 2는 type error 가 발생한다. 

Line 6도 문자만 가능하기 때문에 결측치로 대체할 수 없다.

 

 

연습문제를 풀어보자.

1. professor.csv 파일을 불러온 뒤 ID 컬럼에서 1을 모두 제거하여라. 

2. professor.csv 파일을 불러온 뒤 ID 컬럼에서 a를 숫자 0으로 변경하여라.

 

3. professor.csv 파일을 불러온 뒤 이름에서 두 번째 글자를 마스킹 처리하여라.

 

4. professor.csv 파일을 불러온 뒤 ID에서 특수기호를 삭제하여라

이 방법은 두 가지가 있다.

처음에 \W 가 적용이 안되어서 [[:punct:]]로 넣었는데 R에서는 \ 를 두 번 넣어야 된다고 하셨다.

언더바까지 삭제하기 위하여 | 또는 을 넣고 언더바도 추가하였다.

 

 

이름이 김나나 인 사람과 비비 라는 사람은 어떻게 적용이 될까?

김나나의 경우 내가 생각한대로 이름 가운데 마스킹 된 경우는 Line 1이며, 

비비의 경우는 Line 6, 7 번이 마스킹이 잘 되었으나 성만 가려지고 이름은 가려지지 않았다.

 

 

참고로 regex 함수가 있다.

regex함수는 복잡하거나 반복되는 정규식 표현을 파싱하기 위한 함수로 다음과 같이 적용할 수 있다.

 

 

728x90

 

 

4. 문자열 결합

str_c

str_c(....,                           # 다변형 인수 전달 방식, 개수 제한 없음

         sep = '',                   # 분리구분기호, Default는 빈문자열이며, 낱개로 보낼 때 사용됨

         collapse=NULL)      # 분리구분기호, Default는 NULL이며 묶음으로 보낼 때 사용됨(벡터 내부 결합)

 

 

이렇게 낱개로 들어가게 되면 Default가 빈문자열이므로 abc로 결합하게 된다. 

그리고 sep에 바 를 넣으면 abc 사이가 - 로 연결된다.

 

 

벡터 형식으로 들어가게 되면 collapse 옵션을 쓰지 않은 경우 연결해주는 옵션이 NULL이어서 각각 출력된다. collapse 옵션에 ''을 넣어주면 빈문자열이 사이를 이어주므로 연결된 결과 값이 출력된다.

 

 

이와 연관된 연습문제를 풀어보겠다.

emp에서 각 직원의 정보를 아래와 같이 출력하여라.

SMITH의 10% 인상된 급여는 880이다.

 

 

인덱스 색인이 아닌 경우에는 괄호 안에서 SAL의 계산이 가능하다. 

그래서 굳이

emp$SAL2 <- emp$SAL*1.1 한 후에 str_c에 emp$SAL2 를 넣지 않아도 된다.

 

 

emp의 모든 직원의 이름을 아래와 같이 출력하여라

SMITH-ALLEN-WARD-JONES-...-MILLER

 

 

professor에서 이름의 두 번째 글자를 마스킹 처리하여라(문자열 결합으로 처리)

 

 

5. 문자열 분리

str_split 

SQL에는 문자열 분리가 없다. 하나를 분리하면 두 개가 나오는데 분리된 자료를 담을 자료 구조 개념이 없기 때문이다.

 

str_split(string =     ,  # 원본

             pattern =  )   # 패턴(정규식 표현식 사용 가능)

@로 구분된 문자열을 분리하였다.

이때 console 창에 대괄호로 두 번 묶인 [[1]]이 있는데 이게 key number이다.

여기서 리스트가 나온 것이다.

 

다음 하나 더 살펴보자

한 원소를 분리하였을 때 키 넘버가 하나 출력되었는데, 두 원소를 분리하니 각 원소마다 키 넘버가 구분되어 소문자 문자열열은 [[1]]의 키 넘버를, 대문자 문자열은 [[2]] 키 넘버를 갖고 출력된다

 

출력 결과가 매트리스 일 리는 없고, 그렇다고 1차원 자료를 2차원으로 나올 이유도 없다. 각각 분리해서 데이터를 저장하고자 할 때 독립적인 데이터이므로 원소끼리 따로 저장하고자 이렇게 리스트 자료 구조로 저장이 된다.

SQL에 비하여 자료를 담을 수 있는 공간이 다양하다보니 다양한 표현이 가능하다.

[[1]]을 1층이라고 읽는다.

 

위의 테스트 결과를 살펴보자

리스트에서 v1[2] 이렇게 대괄호 하나를 쓰면 이것은 층을 의미한다.

그런데 v1은 1층밖에 없으므로 NULL이 출력된다.

v1[[1]] 이렇게 선언하면 벡터가 추출된다.

v1[[1]][2] 여기서 리스트가 2차원이 아닌 것을 알 수 있다. 해석 상 1층의 두 번째 원소라는 의미이다.

v1[1,2] 라고 쓰면 에러가 난다. 이는 2차원 데이터 프레임에서 자료를 읽어오는 형식이기 때문이다.

v2[1][2]의 의미는 1층을 선택한 후에 2층을 선택하라는 의미이므로 NULL이다.

 

 

복습 후기

오늘 배운 게 너무 많은 것 같다.

하나하나 복기해보느라 어제 내로 다 못봤고 두시 반에 일어나서 이어서 보는데 집 PC에서 stringr 패키지를 불러오는 데에 문제가 생겨가지고 학원에 등원하여 간신히 마무리 한다.

오늘 진도 빼기 전에 한번 훑어서 다행이다.

728x90
반응형