[ R ] List 자료구조 & 문자열처리
List 자료구조
- 성격이 다른 자료형(문자열, 숫자형, 논리형)과 자료구조(벡터, 행렬, 리스트, 데이터프레임)를 객체로 생성 가능
- 키(key)와 값(value)이 한쌍으로 저장 python의 dictionary와 유사
- key를 통해 value를 불러오는데 value에 해당하는 자료는 Vector, Matrix, Array, data.frame 등 대부분의 R 객체가 저장 가능
- 함수 내에서 여러 값을 하나의 키로 묶어서 반환하는 경우 유용하다. 리스트 생성 함수: list()
- 리스트 자료 처리 함수: unlist(), lapply(), sapply()
(1)key 생략
- 키 생략 시 자동으로 기본키 생성
- 기본키는 [[n]]형식으로 출력 (n은 index)
- 값은 [n] 형식으로출력 (n은 index)
ex ) key생략한 list 생성
list <- list("lee", "이순신", 95) list # 결과값에 key값 없음 # [[1]] # [1] "lee" # # [[2]] # [1] "이순신" # # [[3]] # [1] 95 |
ex ) 리스트를 벡터 구조로 변경
unlist <- unlist(list) unlist # [1] "lee" "이순신" "95" |
- unlist()함수: 리스트 형태의 자료구조를 벡터 형식의 자료구조로 변경
ex ) 1개 이상의 값을 갖는 리스트 객체 생성
num <- list(c(1:5), c(6, 10)) num # [[1]] # [1] 1 2 3 4 5 # # [[2]] # [1] 6 10 |
(2) key와 value형식리스트 객체의 자료 처리 함수
형식: list(key1 = value1, key2 = value2, ..., keyn = valuen)
ex ) key와 value형식으로 리스트 객체 생성
member <- list(name = c("홍길동", "유관순"), age = c(35, 25), address = c("한양", "충남"), gender = c("남자", "여자"), htype = c("아파트", "오피스텔")) member # $name # [1] "홍길동" "유관순" # # $age # [1] 35 25 # # $address # [1] "한양" "충남" # # $gender # [1] "남자" "여자" # # $htype # [1] "아파트" "오피스텔" member$name # [1] "홍길동" "유관순" member$name[1] # [1] "홍길동" member$name[2] # [1] "유관순" |
ex ) key를 이용하여 value에 접근
member$age[1] <- 45 member$id <- "hong" member$pwd <- "1234" member # $name # [1] "홍길동" "유관순" # # $age # [1] 45 25 # # $address # [1] "한양" "충남" # # $gender # [1] "남자" "여자" # # $htype # [1] "아파트" "오피스텔" # # $id # [1] "hong" # # $pwd # [1] "1234" member$age <- NULL # age 제거 member # $name # [1] "홍길동" "유관순" # # $address # [1] "한양" "충남" # # $gender # [1] "남자" "여자" # # $htype # [1] "아파트" "오피스텔" # # $id # [1] "hong" # # $pwd # [1] "1234" length(member) # [1] 6 mode(member); class(member) # class->list # [1] "list" # [1] "list" |
리스트 원소의 key를 호출하기 위하여 변수명$키 형식으로 작성
(3) 리스트 객체의 자료 처리 함수
ex ) 리스트 객체에 함수 적용
a <- list(c(1:5)) b <- list(c(6:10)) a # [[1]] # [1] 1 2 3 4 5 b # [[1]] # [1] 6 7 8 9 10 lapply(c(a, b), max) # [[1]] # [1] 5 # # [[2]] # [1] 10 |
lapply()함수: 함수 적용 후 리스트 형태로 반환
ex ) 리스트 형식을 벡터 형식으로 반환
sapply(c(a, b), max) # [1] 5 10 |
sapply()함수: 함수 적용 후 벡터 형식으로 반환
(4) 다차원 리스트 객체 생성
다차원 리스트(중첩): 리스트 자료구조에 다른 리스트가 중첩된 자료구조
ex ) 다차원 리스트 객체 생성
multi_list <- list(c1 = list(1, 2, 3), c2 = list(10, 20, 30), c3 = list(100, 200, 300)) multi_list$c1; multi_list$c2; multi_list$c3 # [[1]] # [1] 1 # # [[2]] # [1] 2 # # [[3]] # [1] 3 # # [[1]] # [1] 10 # # [[2]] # [1] 20 # # [[3]] # [1] 30 # # [[1]] # [1] 100 # # [[2]] # [1] 200 # # [[3]] # [1] 300 |
ex ) 다차원 리스트를 열 단위로 바인딩
do.call(cbind, multi_list) # c1 c2 c3 # [1,] 1 10 100 # [2,] 2 20 200 # [3,] 3 30 300 class(do.call(cbind, multi_list)) # [1] "matrix" "array" |
do.call()함수: 다차원 리스트를 구성하는 리스트를 각각 분해한 후 지정된 함수를 호출하여 리스트 자료를 처리
문자열 처리
(1) stringr 패키지 제공 함수
ex ) 문자열 추출
install.packages("stringr") library(stringr) str_extract("홍길동35이순신45유관순25", "[1-9]{2}") # [1] "35" str_extract_all("홍길동35이순신45유관순25", "[1-9]{2}") # [[1]] # [1] "35" "45" "25" |
(2) 정규표현식
정규표현식: 추출하려는 문자열의 패턴을 지정
반복 관련 정규표현식
정규표현식에서 [ ] 기호는 대괄호 안의 문자가 {n}에서 n만큼 반복된다.
ex. [a-z]{3} : 영문 소문자가 연속으로 3개 발생
[a-z]{3,} : 영문 소문자가 3자 이상 연속하는 것 추출
[a-z]{3,5} : 영문 소문자가 3-5자 연속하는 것 추출
ex ) 반복 수를 지정하여 영문자 추출하기
string <- "hongkd105leess1002you25강감찬2005" str_extract_all(string, "[a-z]{3}") #3글자 영문만 # [[1]] # [1] "hon" "gkd" "lee" "you" str_extract_all(string, "[a-z]{3,}") #3글자이상 # [[1]] # [1] "hongkd" "leess" "you" str_extract_all(string, "[a-z]{3,5}") #3~5글자만 # [[1]] # [1] "hongk" "leess" "you" |
문자와 숫자 관련 정규표현식
ex ) 문자열에서 한글, 영문자, 숫자 추출
str_extract_all(string, "hong") # [[1]] # [1] "hong" str_extract_all(string, "25") # [[1]] # [1] "25" str_extract_all(string, "[가-힣]{3}") #연속된 3개의 한글문자열 추출 # [[1]] # [1] "강감찬" str_extract_all(string, "[a-z]{3}") # [[1]] # [1] "hon" "gkd" "lee" "you" str_extract_all(string, "[0-9]{4}") # [[1]] # [1] "1002" "2005" |
특정 문자열을 제외하는 정규표현식 형식:
“[^제외문자열]”: 헤딩 문자열을 제외하고 나머지 추출
“[^제외문자열]{n}”: 문자열을 제외하고 연속된 n글자 추출
ex ) 문자열에서 한글, 영문자, 숫자를 제외한 나머지 추출하기
str_extract_all(string, "[^a-z]") # [[1]] # [1] "1" "0" "5" "1" "0" "0" "2" "2" "5" "강" "감" "찬" "2" # [14] "0" "0" "5" str_extract_all(string, "[^a-z]{4}") # [[1]] # [1] "1002" "25강감" "찬200" str_extract_all(string, "[^가-힣]{5}") # [[1]] # [1] "hongk" "d105l" "eess1" "002yo" str_extract_all(string, "[^0-9]{3}") # [[1]] # [1] "hon" "gkd" "lee" "you" "강감찬" |
한 개의 숫자와 단어 관련 정규표현식
숫자와 단어를 패턴으로 지정할 수 있는 정규표현식
ex ) 주민등록번호 검사
jumin <- "123456-1234567" str_extract(jumin, "[0-9]{6}-[1234][0-9]{6}") # [1] "123456-1234567" str_extract_all(jumin, "\\d{6}-[1234]\\d{6}") # [[1]] # [1] "123456-1234567" |
“\\d{6}” : 숫자가 6개 연속된 패턴을 지정하는 정규표현식. "[0-9]{6}” 과 같은 결과 산출
ex ) 지정된 길이의 단어 추출
name <- "홍길동1234,이순신5678,강감찬1012" str_extract_all(name, "\\w{7,}") # [[1]] # [1] "홍길동1234" "이순신5678" "강감찬1012" |
“\\w{7}” : 단어의 길이가 7이상인 패턴을 지정하는 정규표현식 * 특수문자 제외
(3) 문자열 연산
문자열 길이와 위치
ex ) 문자열 길이 구하기
string <- "hongkd105leess1002you25강감찬2005" len <- str_length(string) len # [1] 30 |
str_length()함수: 문자열의 길이
ex ) 문자열 내 특정 문자열의 index
string <- "hongkd105leess1002you25강감찬2005" str_locate(string, "강감찬") # start end # [1,] 24 26 |
str_locate()함수: 문자열 내에서 특정 단어의 위치 표시
부분 문자열 만들기
ex ) 부분 문자열 만들기
string_sub <- str_sub(string, 1, len - 7) string_sub # [1] "hongkd105leess1002you25" string_sub <- str_sub(string, 1, 23) string_sub # [1] "hongkd105leess1002you25" |
대ㆍ소문자 변경하기
str_to_upper()함수: 주어진 문자열에서 소문자를 대문자로 변경
str_to-lower()함수: 주어진 문자열에서 대문자를 소문자로 변경
ex ) 대문자, 소문자 변경하기
ustr <- str_to_upper(string_sub); ustr # [1] "HONGKD105LEESS1002YOU25" str_to_lower(ustr) # [1] "hongkd105leess1002you25" |
문자열 교체ㆍ결합ㆍ분리
ex ) 문자열 교체하기
str_replace(문자열, 변경될 인자, 변경할 인자)함수
string_sub # [1] "hongkd105leess1002you25" string_rep <- str_replace(string_sub, "hongkd105", "홍길동35,") string_rep <- str_replace(string_rep, "leess1002", "이순신45,") string_rep <- str_replace(string_rep, "you25", "유관순25,") string_rep # [1] "홍길동35,이순신45,유관순25," |
ex ) 문자열 결합하기
str_c(문자열, 추가인자)함수
string_rep # [1] "홍길동35,이순신45,유관순25," string_c <- str_c(string_rep, "강감찬55") string_c # [1] "홍길동35,이순신45,유관순25,강감찬55" |
ex ) 문자열 분리
str_replace(문자열, 변경될 인자, 변경할 인자)함수
string_c # [1] "홍길동35,이순신45,유관순25,강감찬55" string_sp <- str_split(string_c, ",") string_sp # [[1]] # [1] "홍길동35" "이순신45" "유관순25" "강감찬55" |
문자열 합치기
Paste()함수 이용 여러 개의 문자열로 구성된 벡터 객체를 대상으로 구분자를 적용하여 하나의 문자열을 갖는 벡터 객체로 합칠 수 있다.
ex ) 문자열 합치기
# 단계 1: 문자열 벡터 만들기 string_vec <- c("홍길동35", "이순신45", "유관순25", "강감찬55") string_vec # [1] "홍길동35" "이순신45" "유관순25" "강감찬55" # 단계 2: 콤마를 기준으로 문자열 벡터 합치기 string_join <- paste(string_vec, collapse = ",") string_join # [1] "홍길동35,이순신45,유관순25,강감찬55" |