Programming/R

[ R ] List 자료구조 & 문자열처리

yul_S2 2022. 11. 16. 08:17
반응형

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"

 

반응형