이 연습에서는 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함수는 복잡하거나 반복되는 정규식 표현을 파싱하기 위한 함수로 다음과 같이 적용할 수 있다.
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 패키지를 불러오는 데에 문제가 생겨가지고 학원에 등원하여 간신히 마무리 한다.
오늘 진도 빼기 전에 한번 훑어서 다행이다.
'배우기 > 복습노트[R과 분석]' 카테고리의 다른 글
[복습] R(programming language) 문자열 함수 정리하기 (2) (0) | 2023.11.23 |
---|---|
[실습문제] 2023. 11. 22.(수) (3문제) (0) | 2023.11.23 |
[복습] R(programming language) 자료구조(데이터 프레임) (3) (0) | 2023.11.23 |
[복습] R(programming language) 자료구조(벡터) (2) (0) | 2023.11.22 |
[복습] R(programming language) 연산자 정리 (0) | 2023.11.22 |