본문 바로가기
R/Data Type

R 리스트 List - 생성/관련함수/인덱싱

by 통계열등생 2020. 8. 11.
반응형

리스트는 키(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 - 생성/관련함수/인덱싱>

반응형

댓글