티스토리 뷰
리스트(list)
리스트는 Key-value 형태로 저장되는 데이터 형식입니다.
key - value
name : smith
tel : 02)345-6958
sal : 4000
프로그래밍을 해보신 분 이라면, C의 구조체, 파이썬의 딕셔너리와 같은 구조라고 생각하시면 됩니다.
리스트는 벡터와 다르게 서로 다른 데이터 타입을 허용하지만, 리스트의 key 안의 데이터 타입은 같아야 합니다.
분석에서는 자주 사용되지 않지만 알고는 있는게 좋겠죠?
먼저, 벡터로도 리스트를 만들 수 있지만, 데이터 타입이 다르면 만들 수 없고, 따로 이름 지정을 해주어야 합니다.
[1] "smith" "02)345-6958" "4000"
> names(val1) <- c('name', 'tel', 'sal') # 이름 지정이 필요
> val1
name tel sal
"smith" "02)345-6958" "4000"
리스트의 생성
리스트는 층별 구조를 가지고, 층의 이름을 key, 층 안의 데이터를 value로 부릅니다.
key2 = value2,
.. )
tel='02)345-6958',
sal=4000)
> list1
$name
[1] "smith"
$tel
[1] "02)345-6958"
$sal
[1] 4000 # 벡터와 다르게 숫자인 4000이 숫자 그대로 저장됩니다.
리스트의 색인
리스트에서 key는 컬럼이라고도 할 수 있고, 자료를 구별하기 위한 목적을 가지고 있습니다.
나중에 유용하게 사용된다고 하시니 잘 알아둬야겠네요!
$name
[1] "smith"
> list1[['name']] # 위의 출력 결과에서 key($name)를 생략하고 값만 출력. [ ] 를 더 붙여주면 됩니다.
[1] "smith"
> list1[1] # 1번째 키를 색인하는 숫자 색인, 특정 key의 값("smith")와 key($name)가 함께 출력됩니다.
$name
[1] "smith"
> list1[[1]] # 마찬가지로 [ ] 를 더 붙여주면 key의 값만 출력할 수 있습니다.
[1] "smith"
> list1$name # 위의 과정들이 번거롭다면 리스트에서는 $ 로 값에 접근할 수 있습니다.
[1] "smith"
# 각 key마다 여러개의 값을 갖는 리스트 내 특정 원소 출력
# 각 층 안의 데이터들은 모두 같은 데이터 타입이어야 합니다. 각 층의 데이터들은 벡터형식이므로!!
> list2 <- list(name=c('smith','allen'),
+ tel = c('02)123-3445', '031)234-3432'),
+ sal = c(4000, 5000))
> list2
$name
[1] "smith" "allen"
$tel
[1] "02)123-3445" "031)234-3432"
$sal
[1] 4000 5000
> list2$tel[2] # 리스트에서 특정 key(tel)의 2번 째 값
[1] "031)234-3432"
> list2['tel'] # 출력 형태가 key-value 상태이므로, 벡터일 때 사용하는 숫자색인 [2] 사용 불가
$tel
[1] "02)123-3445" "031)234-3432"
> list2[['tel']][2] # key 값에 저장된 value 값에 접근한 후(벡터 상태) [2] 를 사용
[1] "031)234-3432"
리스트의 key-value 삽입, 삭제
# 리스트$정의되지 않은 컬럼 <- 삽입할 key 값
# 중간에는 컬럼(key) 삽입 불가. 맨 마지막에 key가 삽입
> list1$gender <- 'm'
> list1
$name
[1] "smith"
$tel
[1] "02)345-6958"
$sal
[1] 4000
$gender
[1] "m"
# 리스트 value 삽입
> list1$name[length(list1$name)+1] <- "aaron" # 리스트의 길이(리스트의 맨 마지막 위치)+1
> list1
$name
[1] "smith" "aaron"
$tel
[1] "02)345-6958"
$sal
[1] 4000
$gender
[1] "m"
# 리스트 key 삭제
> list1$sal <- NULL # key에 null을 저장하므로써 key를 삭제하는 방법입니다.
> list1
$name
[1] "smith" "aaron"
$tel
[1] "02)345-6958"
$gender
[1] "m"
# 리스트 value 삭제
> list1$name[length(list1$name)] <- NA # value 공간은 벡터형식이므로 na 값으로 value를 삭제해주어야합니다.
> list1 # null을 저장 시 value들의 주소가 이동하게 되므로(ex. 중간에 있는 value 삭제 시) 이동을 막아두었다고하네요.
$name
[1] "smith" NA
$tel
[1] "02)345-6958"
$gender
[1] "m"
Q.
no name price qty
1 apple 500 5
2 banana 200 2
3 peach 200 7
4 berry 50 9
# 1. 리스트 생성
> no <- c(1,2,3,4)
> name <- c('apple', 'banana','peach','berry')
> price <- c(500,200,200,50)
> qty <- c(5,2,7,9)
> list1 <- list(no = no, name = name, price = price, qty = qty)
# 1-1. name 에서 3번째 값 출력
> list1$name[3]
[1] "peach"
> list1[['name']][3]
[1] "peach"
# 1-2, name 마지막에 mango 값 삽입
> list1$name[5] <- 'mango'
관련 참고 글
[R] 리스트(list) <- Key-value 형태로 저장되는 데이터 구조
[R] 행렬(Matrix) <- 행과 열의 구조를 갖는 2차원 배열 구조
[R] 배열(Array) <- 동일한 데이터 타입으로 구성된 다차원 데이터구조
[R] 데이터 프레임(Date Frame) <- 엑셀 시트와 유사한 표 형태를 가진 데이터 구조
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성 과정
'R > Process' 카테고리의 다른 글
[R] 배열(Array) (0) | 2018.12.27 |
---|---|
[R] 행렬(Matrix) (0) | 2018.12.26 |
[R] 날짜와 시간 - as.Date, lubridate (0) | 2018.12.24 |
[R] 진리값, 진리값의 연산자 (0) | 2018.12.24 |
[R] 팩터 (factor) (5) | 2018.12.24 |