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
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
3.6.4 리스트의 데이터 수정
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"