https://metime.tistory.com/105
어제 문자열 함수를 배우고 오늘 남은 것들을 배웠다.
1. 대소치환
str_to_lower()
str_to_upper()
str_to_title()
2. 문자열 추출
str_sub()
3. 치환
str_replace()
str_replace_all()
4. 문자열 결합
str_c()
5. 문자열 분리
str_split()
이렇게는 위의 링크에 정리되었고, 오늘 배운 것은 아래로 계속 작성하겠다.
6. 문자열 패턴
str_detect()
oracle에서 regexp_like와 유사하다.
특정 패턴을 포함하는지의 여부(T/F)가 리턴된다.
str_detect(string = , # 대상
pattern = ) # 정규식 표현 가능
예) a 또는 A로 시작하는
Line 4~ 6은 옳은 표현이다. 그러나 Line 8은 a로 시작하거나 A를 포함하는 으로 출력된다.
아래는 a 또는 A가 연속적으로 2회 포함된 코드이다.
LIne 5와 Line6은 구분이 잘 가지 않는데, 이건 replace를 하면 차이를 알 수 있다.
Line 8, 9의 결과를 출력하였다.
특수기호를 넣고 테스트를 한 결과이다.
연습문제를 풀어보자.
professor 데이터를 이용하여 ID 컬럼에 두 자 이상의 숫자가 연속 포함된 교수의 이름, ID를 출력하여라
professor ID 컬럼에서 특수기호를 모두 삭제하여라
professor ID 컬럼에서 p로 시작하고 n으로 끝나는 단어를 삭제하여라.
위와 같은 코드에서는 ^p를 하는 경우 중간에 p로 시작하는 단어가 있을 수도 있으니 햇 기호를 생략하라고 하셨다.
아래 두 차이를 비교해보면 알 것이다.
햇 기호(^)에 따라 결과가 달라지는 것을 알 수 있다.
7. 문자열 포함 횟수
str_count()
str_count(string = # 대상
pattern = ) # 정규식 표현 가능
그냥 \\d를 찾으면 숫자 하나하나 개수를 세는데 \\d+ 하면 한 덩어리를 센다.
8. 문자열 삭제
str_remove() 하나를 지움
str_remove_all() 전체를 지움
str_remove(string = , # 대상
pattern = ) # 정규식 표현 가능
Line 1은 콤마 하나만 지우고 , Line 2는 모든 콤마를 삭제하였다.
9. 문자열 삽입
str_pad()
str_pad(string = , # 대상
width = , # 총 자리수
side = , # 방향 (left, right, both)
pad =' ' ) # 삽입문자, 한 칸의 공백이 Default이다.
예제를 하나 풀어보자.
data2.csv 파일에서 시간 컬럼의 값을 시작 시간으로 대체하여라
10. 공백삭제
str_trim() (공백삭제용으로만 사용됨)
str_trim(string = , # 대상
side = ) # 삭제 방향(left, right, both)
11. 문자열 반복
str_dup()
지역번호 마스킹 처리를 할 때 국번이 세 자이거나 네 자일 때 이 국번들을 추출하여 개수만큼 x를 반복하고 싶을때, sql에서는 lpad('x'. 4. 'x') 로 처리했었다.
str_dup(string = , # 대상
times = ) # 반복횟수
이런식으로 사용할 수 있다.
참고로 rep 라는 함수도 있는데, 이 함수도 반복을 시킨다.
그런데 rep는 대상이 벡터여서 벡터의 반복을 수행하고 str_dup는 문자열의 반복을 수행한다.
rep(x, # 대상(벡터)
....) # each, times
rep의 예시이다.
12. 문자열의 위치
str_locate()
str_locate_all()
str_locate(string = , # 대상
pattern = ) # 정규식 표현 전달 가능
Line 1의 경우 최초로 발견된 값 하나만 리턴된다. 즉 처음 발견된 패턴의 위치를 추출한다.
Line 2는 모든 위치의 값을 리턴한다
start와 end가 나온 이유는 발견하고자 하는 문자가 덩어리 일 수도 있기 때문이다.
Line 4를 보면 시작위치와 끝 위치가 다르게 추출되는 것을 볼 수 있다.
데이터마다 시작값과 끝 값을 알려주어야 한다. 그래서 두 개의 컬럼이 필요하다. 그러나 리스트는 두 개의 컬럼을 보여줄 수 없다.
위와 같은 경우 더이상 리스트가 될 수 없다. 이제는 값이 밑으로 내려가며 쌓이고 start와 end가 진행되어야 하므로 2차원이다. 즉 행렬(matrix)이다. 행렬로 추출되는 이유는 숫자로만 구성된 값이기 때문이다.
이 같은 경우 리스트 안에 메트릭스가 있다.
이렇게 메트릭스를 유지하면서 층(key)를 유지하고 있다.
문제를 하나 풀어보자
professor.csv 파일의 ID에서 숫자 하나의 위치를 각 원소마다 출력하여라.
이건 Line 2의 추출 결과이고, 행렬이 추출되었다.
이건 Line 3의 추출결과이고 리스트가 추출되었다(리스트 안에 메트릭스)
어쩔 수 없이 자료 구조가 이렇게밖에 선택이 되지 않는다.
그냥 이렇다고 이해하면 된다.
데이터 프레임은 key 별로 데이터 개수가 같다. 행 자체로도 의미가 있다.
리스트는 공통 속성으로 여러 개를 모아둔 것이다.
[[1]] 층 또는 key라고 부르며 속성이라고도 한다. 데이터를 정리할 목적을 지나며, 이름이 없으면 그냥 층 번호로 불린다. 이름이 지어지면 [[이름]] 의 형태가 된다.
str_split의 출력 결과가 왜 리스트일까?
c('a|b', 'a|b|c') 가 있다 그대로 split 한다면 (a, b, a, b, c) 가 되며, 어느 원소가 어느 곳에서 나왔는지 구분하기 어려우므로 리스트로 저장하는 것이다.
[[1]]a, b [[2]]a, b, c
13. 문자열의 길이
str_length()
length와의 차이점을 보자.
length는 벡터 원소의 수가 출력된다.
str_length는 벡터 원소 각각의 문자열 길이를 의미한다.
여기까지 문자열 함수를 마무리하겠다.
'배우기 > 복습노트[R과 분석]' 카테고리의 다른 글
[실습문제] 2023. 11. 23.(목) (3문제) (0) | 2023.11.24 |
---|---|
[복습] R(programming language) 자료구조(리스트) (4) + 복습후기(20231123) (0) | 2023.11.24 |
[실습문제] 2023. 11. 22.(수) (3문제) (0) | 2023.11.23 |
[복습] R(programming language) 문자열 함수 정리하기 + 복습후기(20231122) (0) | 2023.11.23 |
[복습] R(programming language) 자료구조(데이터 프레임) (3) (0) | 2023.11.23 |