리스트는 키(key)와 값(value) 형태의 데이터를 한 쌍으로 저장하는 자료구조이다.
리스트는 key를 통해서 값(value)을 참조한다.
벡터와 달리 다양한 자료형과 자료구조를 가질 수 있다.
◎ 리스트 생성
- key 생략
> x = c(1, 3, 5)
> lst = list(3, x, "Korea")
> print(lst)
[[1]]
[1] 3
[[2]]
[1] 1 3 5
[[3]]
[1] "Korea"
> cat(lst)
Error in cat(lst) :
타입 'list'인 인자 1는 'cat'에 의하여 다루어 질 수 없습니다
리스트를 만들 때는 list() 함수를 사용한다.
리스트를 출력할 때는 print() 함수를 사용해야 하며 cat() 함수를 사용하면 오류가 발생한다. print() 함수 대신 객체의 이름만 써도 동일하게 출력된다.
- key = value
> lst2 = list(first=1:5, second=c(1,2))
> lst2
$first
[1] 1 2 3 4 5
$second
[1] 1 2
키를 지정해주면 달러사인($) 뒤에 키 이름이 붙어 출력된다.
- 다양한 자료형
> lst3 = list(name=c('홍길동','유관순'),
+ age=c(35,25),
+ gender=c('M','F')); lst3
$name
[1] "홍길동" "유관순"
$age
[1] 35 25
$gender
[1] "M" "F"
- 다양한 자료구조
> lst4 = list(one=c('one','two','three'),
+ two=matrix(1:9,3,3),
+ three=array(1:12,c(2,3,2))); lst4
$one
[1] "one" "two" "three"
$two
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$three
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
하나의 리스트 객체 안에 벡터, 행렬, 배열 등 다양한 자료구조를 저장할 수 있다.
- 중첩 리스트
> multi_list = list(r1=list(a=1,b=2,c=3),
+ r2=list(10,20,30)); multi_list
$r1
$r1$a
[1] 1
$r1$b
[1] 2
$r1$c
[1] 3
$r2
$r2[[1]]
[1] 10
$r2[[2]]
[1] 20
$r2[[3]]
[1] 30
◎ 리스트 관련 함수
- do.call()
> x = do.call(rbind, multi_list) # do.call(함수, 객체)
> x
a b c
r1 1 2 3
r2 10 20 30
> typeof(x)
[1] "list"
중첩 리스트에서 정의된 multi_list 객체를 do.call() 함수에 넣고, rbind() 함수를 사용해서 행렬처럼 보이게 만들어 보았다. 하지만 typeof() 함수로 자료형을 출력해보면 여전히 "list" 인 것을 확인할 수 있다.
- names()
> lst2
$first
[1] 1 2 3 4 5
$second
[1] 1 2
> names(lst2)
[1] "first" "second"
리스트에서 키의 이름만 나열하고자 할 때는 names() 함수를 사용한다.
- unlist()
> x = list(1:10); x
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> v = unlist(x); v # list -> vector
[1] 1 2 3 4 5 6 7 8 9 10
- list 처리 함수
> a = list(1:5)
> b = list(6:10)
> lapply(c(a,b), max) # list 반환
[[1]]
[1] 5
[[2]]
[1] 10
> sapply(c(a,b), max) # vector 반환
[1] 5 10
◎ 리스트 인덱싱(indexing)
- 대괄호 [ ]
> lst = list(one=1:5, two=6:10)
> lst
$one
[1] 1 2 3 4 5
$two
[1] 6 7 8 9 10
> lst[1] # key + value index
$one
[1] 1 2 3 4 5
> lst[[1]] # value index
[1] 1 2 3 4 5
> lst[[1]][3] # 특정 value index
[1] 3
- 달러사인 $
> lst$one # value index
[1] 1 2 3 4 5
> lst$one[5] # 특정 value index
[1] 5
> mean(lst$one)
[1] 3
리스트 인덱싱에서 키 이름(키명)을 지칭할 때는 "객체[[키명]]" or "객체$키명" 형식을 사용한다.
키 안에 있는 값(value)를 지칭할 때는 대괄호를 한번 더 사용해서 "객체[[키명]][값index]" or "객체$키명[값index]" 형식을 사용한다.
데이터 프레임(data.frame) 자료구조에서도 달러사인($)을 사용하는데 데이터 프레임에서는 키명 대신 칼럼명을 사용해서 인덱싱을 한다.("객체$칼럼명")
- 값 치환
> lst[[1]] = c('a', 'b', 'c')
> lst$two = c(12, 15, 13)
> lst
$one
[1] "a" "b" "c"
$two
[1] 12 15 13
> names(lst)
[1] "one" "two"
> names(lst) = c('first', 'second')
> lst
$first
[1] "a" "b" "c"
$second
[1] 12 15 13
names() 함수를 사용해서 키 이름도 바꿀 수 있다.
- 값 추가
> lst[[1]] = c(lst$first, 'd', 'e')
> lst$third = 1:5
> lst
$first
[1] "a" "b" "c" "d" "e"
$second
[1] 12 15 13
$third
[1] 1 2 3 4 5
c() 함수로 기존의 값에 추가할 수 있고, 새로운 세번째 키와 값을 추가할 수도 있다.
- 값 삭제
> lst[[3]] = NULL
> lst[[1]] = lst[[1]][-c(4:5)]
> lst
$first
[1] "a" "b" "c"
$second
[1] 12 15 13
리스트의 키를 삭제할 때는 NULL을 사용하고, 키 안의 값은 마이너스(-)를 사용하여 특정 값을 삭제할 수 있다.
<R 리스트 List - 생성/관련함수/인덱싱>
'R > Data Type' 카테고리의 다른 글
R 데이터프레임 DataFrame - 생성과 저장 text/csv/excel파일 (0) | 2020.10.19 |
---|---|
R 배열 Array - 생성/인덱싱 (0) | 2020.10.16 |
R 행렬 Matrix - 생성/연산/인덱싱 (0) | 2020.10.14 |
R 벡터 Vector - 생성/연산/인덱싱 (0) | 2020.07.28 |
R 스칼라 Scalar - 자료형/내장형상수 (0) | 2020.07.28 |
댓글