3.6 R 리스트 List

리스트(List)는 벡터, 행렬, 배열, 데이터 프레임 등과 같은 서로 다른 구조의 객체들을 하나로 묶은 것입니다. 기차처럼 이어서 묶어 놓은 것을 상상하면 될 것입니다.

3.6.1 리스트 만들기

숫자 벡터, 문자벡터, 행렬, 데이터 프레임을 하나로 묶어서 mylist라는 변수에 할당하겠습니다.

# 숫자 벡터
numvec <- seq(1, 10, by = 2)
# 문자 벡터
strvec <- c("대한", "민국", "행정")
# 행렬
mtx <- matrix(1:12, ncol = 3)

# 데이터 프레임
name <- c("유재석", "홍진영", "송가인", "강호동", "이영자", "김종민", "김연아")
age <- c(24, 28, 31, 25, 27, 22, 29)
sex <- c("남", "여", "여", "남", "여", "남", "여")
score <- c(90, 80, 85, 75, 95, 80, 70)
df <- data.frame(name, age, sex, score, stringsAsFactors = FALSE)

# 리스트 만들기 : 리스트 요소에 이름이 지정되지 않음
mylist <- list(numvec, strvec, mtx, df)
mylist
#> [[1]]
#> [1] 1 3 5 7 9
#> 
#> [[2]]
#> [1] "대한" "민국" "행정"
#> 
#> [[3]]
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
#> 
#> [[4]]
#>     name age sex score
#> 1 유재석  24  남    90
#> 2 홍진영  28  여    80
#> 3 송가인  31  여    85
#> 4 강호동  25  남    75
#> 5 이영자  27  여    95
#> 6 김종민  22  남    80
#> 7 김연아  29  여    70

# 리스트 요소에 이름을 지정하여 리스트 만들기
mylist <- list(numvec = numvec, 
               strvec = strvec, 
               mtx = mtx, 
               df = df)
mylist
#> $numvec
#> [1] 1 3 5 7 9
#> 
#> $strvec
#> [1] "대한" "민국" "행정"
#> 
#> $mtx
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
#> 
#> $df
#>     name age sex score
#> 1 유재석  24  남    90
#> 2 홍진영  28  여    80
#> 3 송가인  31  여    85
#> 4 강호동  25  남    75
#> 5 이영자  27  여    95
#> 6 김종민  22  남    80
#> 7 김연아  29  여    70

3.6.1.1 리스트 요소 이름 지정 또는 변경하기

names(mylist) <- c("numbers", "strings", "matrix_num", "df_score")
mylist
#> $numbers
#> [1] 1 3 5 7 9
#> 
#> $strings
#> [1] "대한" "민국" "행정"
#> 
#> $matrix_num
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
#> 
#> $df_score
#>     name age sex score
#> 1 유재석  24  남    90
#> 2 홍진영  28  여    80
#> 3 송가인  31  여    85
#> 4 강호동  25  남    75
#> 5 이영자  27  여    95
#> 6 김종민  22  남    80
#> 7 김연아  29  여    70

3.6.2 리스트 구조 보기

# 리스트 구조 보기
str(mylist)
#> List of 4
#>  $ numbers   : num [1:5] 1 3 5 7 9
#>  $ strings   : chr [1:3] "대한" "민국" "행정"
#>  $ matrix_num: int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ df_score  :'data.frame':  7 obs. of  4 variables:
#>   ..$ name : chr [1:7] "유재석" "홍진영" "송가인" "강호동" ...
#>   ..$ age  : num [1:7] 24 28 31 25 27 22 29
#>   ..$ sex  : chr [1:7] "남" "여" "여" "남" ...
#>   ..$ score: num [1:7] 90 80 85 75 95 80 70
# 리스트에 있는 객체(요소)의 개수
length(mylist)
#> [1] 4
# 리스트 요소의 이름 추출
names(mylist)
#> [1] "numbers"    "strings"    "matrix_num" "df_score"

3.6.3 리스트에서 데이터 추출

3.6.3.1 특정 위치에 있는 데이터 추출하기

# 행렬(matrix_num) 요소 데이터 추출
# 리스트와 요소사이에 $기호가 사용됨
mylist$matrix_num
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
# 위치 번호 대신 요소 이름을 사용하여 추출
# []는 리스트의 하위 요소를 보여주는 것임. 타입은 list 
mylist["matrix_num"]; typeof(mylist["matrix_num"])
#> $matrix_num
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
#> [1] "list"

# [[]]는 리스트 하위 요소의 데이터를 보여줌. 타입은 integer
mylist[["matrix_num"]]; typeof(mylist[["matrix_num"]])
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
#> [1] "integer"
# df$matrix_num 대신 아래처럼 사용 가능 - 3번째 요소
# mylist$numbers == mylist[["numbers"]] == mylist[[1]]
mylist$numbers; mylist[["numbers"]]; mylist[[1]]
#> [1] 1 3 5 7 9
#> [1] 1 3 5 7 9
#> [1] 1 3 5 7 9
# 리스트의 strings 요소의 3번째 데이터 추출
# 아래 3가지 방식이 동일함
s1 <- mylist$strings[3]
s2 <- mylist[["strings"]][3]
s3 <- mylist[[2]][3]
s1; s2; s3
#> [1] "행정"
#> [1] "행정"
#> [1] "행정"
# 리스트의 요소인 df_score 데이터 프레임의 name 변수 데이터 추출
mylist$df_score$name
#> [1] "유재석" "홍진영" "송가인" "강호동" "이영자" "김종민" "김연아"

3.6.4 리스트의 데이터 수정

# 리스트의 strings 요소의 3번째 데이터를 "정부"로 수정
mylist$strings[3] <- "정부"
mylist$strings
#> [1] "대한" "민국" "정부"

3.6.5 리스트 구조 수정

3.6.5.1 리스트 요소 추가

mylist$new_list <- 1:5
str(mylist)
#> List of 5
#>  $ numbers   : num [1:5] 1 3 5 7 9
#>  $ strings   : chr [1:3] "대한" "민국" "정부"
#>  $ matrix_num: int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ df_score  :'data.frame':  7 obs. of  4 variables:
#>   ..$ name : chr [1:7] "유재석" "홍진영" "송가인" "강호동" ...
#>   ..$ age  : num [1:7] 24 28 31 25 27 22 29
#>   ..$ sex  : chr [1:7] "남" "여" "여" "남" ...
#>   ..$ score: num [1:7] 90 80 85 75 95 80 70
#>  $ new_list  : int [1:5] 1 2 3 4 5

3.6.5.2 리스트 요소 제거

mylist$new_list <- NULL
str(mylist)
#> List of 4
#>  $ numbers   : num [1:5] 1 3 5 7 9
#>  $ strings   : chr [1:3] "대한" "민국" "정부"
#>  $ matrix_num: int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ df_score  :'data.frame':  7 obs. of  4 variables:
#>   ..$ name : chr [1:7] "유재석" "홍진영" "송가인" "강호동" ...
#>   ..$ age  : num [1:7] 24 28 31 25 27 22 29
#>   ..$ sex  : chr [1:7] "남" "여" "여" "남" ...
#>   ..$ score: num [1:7] 90 80 85 75 95 80 70

3.6.5.3 리스트 병합

list1 <- list(x1 = 1:5,
              x2 = LETTERS)
list2 <- list(y1 = 11:17,
              y2 = letters)

# 2개 리스트 병합
mlist <- c(list1, list2)
mlist
#> $x1
#> [1] 1 2 3 4 5
#> 
#> $x2
#>  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
#> [20] "T" "U" "V" "W" "X" "Y" "Z"
#> 
#> $y1
#> [1] 11 12 13 14 15 16 17
#> 
#> $y2
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
#> [20] "t" "u" "v" "w" "x" "y" "z"

3.6.6 리스트를 벡터로 변환

# 리스트를 벡터로 변환
unlist(list1)
#>  x11  x12  x13  x14  x15  x21  x22  x23  x24  x25  x26  x27  x28  x29 x210 x211 
#>  "1"  "2"  "3"  "4"  "5"  "A"  "B"  "C"  "D"  "E"  "F"  "G"  "H"  "I"  "J"  "K" 
#> x212 x213 x214 x215 x216 x217 x218 x219 x220 x221 x222 x223 x224 x225 x226 
#>  "L"  "M"  "N"  "O"  "P"  "Q"  "R"  "S"  "T"  "U"  "V"  "W"  "X"  "Y"  "Z"
# 리스트 요소를 벡터로 변환
unlist(mylist$numbers)
#> [1] 1 3 5 7 9