CHAPTER 4. List

4.1 리스트 생성

lst <- list(0.6826, 0.9544, 0.9974) #list()함수로 리스트 객체 생성
lst                                 #list변수 lst 출력 
## [[1]]
## [1] 0.6826
## 
## [[2]]
## [1] 0.9544
## 
## [[3]]
## [1] 0.9974
lst <- list(1.23, "Apple", c(2,3,5,7), matrix(1:6, ncol=3), mean) #숫자벡터, 문자벡터, 숫자벡터, 행렬, 함수와 같은 다양한 객체 저장 
lst                                 #list변수 lst 출력 
## [[1]]
## [1] 1.23
## 
## [[2]]
## [1] "Apple"
## 
## [[3]]
## [1] 2 3 5 7
## 
## [[4]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[5]]
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x00000000155ac930>
## <environment: namespace:base>
lst <- list()                       #비어있는 리스트를 생성하여 lst에 할당 
lst                                 #list변수 lst출력
## list()
lst[[1]] <- 1.23                    #list변수 lst의 첫번째 원소로 숫자벡터 1.23 할당
lst[[2]] <- "Apple"                 #list변수 lst의 두번째 원소로 문자벡터 "Apple"할당 
lst[[3]] <- c(2,3,5,7)              #list변수 lst의 세번째 원소로 숫자벡터 c(2,3,5,7)할당
lst[[4]] <- matrix(1:6, ncol=3)     #list변수 lst의 네번째 원소로 1x6 행렬 할당 
lst[[5]] <- mean                    #list변수 lst의 다섯번째 원소로 mean 함수 할당
lst
## [[1]]
## [1] 1.23
## 
## [[2]]
## [1] "Apple"
## 
## [[3]]
## [1] 2 3 5 7
## 
## [[4]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[5]]
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x00000000155ac930>
## <environment: namespace:base>

리스트의 생성: 원소의 이름 지정

lst <- list(0.6826, 0.9544, 0.9974)           #3개의 숫자 원소로 이루어진 리스트 변수 lst 생성 
names(lst) <- c("sigma1", "sigma2", "sigma3") #리스트 변수 lst내 각 원소는 이름이 지정됨
lst                                           #리스트 변수 lst를 출력
## $sigma1
## [1] 0.6826
## 
## $sigma2
## [1] 0.9544
## 
## $sigma3
## [1] 0.9974
lst <- list(sigma1=0.6826, sigma2=0.9544, sigma3=0.9974) #각각의 원소별로 이름을 지정하면서 리스트 변수 lst생성 
lst                                                      #리스트 변수 lst출력
## $sigma1
## [1] 0.6826
## 
## $sigma2
## [1] 0.9544
## 
## $sigma3
## [1] 0.9974
names(lst)                                               #names()함수를 활용하여 리스트 변수 lst내 원소의 이름을 출력 
## [1] "sigma1" "sigma2" "sigma3"
length(lst)                                              #length() 함수를 활용하여 리스트 변수 lst내 원소의 갯수 확인
## [1] 3

4.2 리스트 출력

[[]]를 이용한 1개 원소 추출 - 위치 인덱싱

product <- list("A001", "Mouse", 30000)  # list()함수를 이용하여 문자벡터, 문자벡터, 숫자 벡터의 3개 원소를 가진 리스트 변수 product 생성  
product                                  # 리스트 변수 product출력
## [[1]]
## [1] "A001"
## 
## [[2]]
## [1] "Mouse"
## 
## [[3]]
## [1] 30000
product[[3]]                             # 리스트 변수 product의 3번째 원소 그 자체가 출력됨
## [1] 30000
product[3]                               # 리스트 변수 product의 3번째 원소를 리스트 형식으로 출력
## [[1]]
## [1] 30000
class(product[[3]])                      # class()함수 결과로 Numeric이 출력됨  
## [1] "numeric"
class(product[3])                        # class()함수 결과로 list가 출력됨   
## [1] "list"
# product[3] * 0.9                         # list형과는 산술연산 불가능 --> error발생 
product[[3]] * 0.9                       # Numeric형과는 산술연산 가능
## [1] 27000

[]를 이용한 여러원소 추출 - 위치 혹은 논리 인덱싱

product <- list("A001", "Mouse", 30000)  # list()함수를 이용하여 문자벡터, 문자벡터, 숫자 벡터의 3개 원소를 가진 리스트 변수 product 생성  
product                                  # 리스트 변수 product출력
## [[1]]
## [1] "A001"
## 
## [[2]]
## [1] "Mouse"
## 
## [[3]]
## [1] 30000
product[c(1,2)]                          # 첫번째, 두번째 원소가 list형식으로 출력됨
## [[1]]
## [1] "A001"
## 
## [[2]]
## [1] "Mouse"
product[c(FALSE,TRUE,TRUE)]              # TRUE인 두번째, 세번째 원소를 list형식으로 출력
## [[1]]
## [1] "Mouse"
## 
## [[2]]
## [1] 30000
product[-1]                              # 첫번째 원소를 제외하고 list형식으로 출력 
## [[1]]
## [1] "Mouse"
## 
## [[2]]
## [1] 30000

[[]] 혹은 $를 이용한 1개 원소 추출 - 이름 인덱싱

product <- list(id="A001", name="Mouse", price=30000) #list()함수로 3개의 원소에 이름을 지정하여 리스트 생성 
product                                  #리스트 변수 product 출력
## $id
## [1] "A001"
## 
## $name
## [1] "Mouse"
## 
## $price
## [1] 30000
product[["name"]]                        #원소의 이름이 name인 원소 그 자체를 출력
## [1] "Mouse"
product$name                             #원소의 이름이 name인 원소 그 자체를 출력
## [1] "Mouse"

[]를 이용한 여러 원소 추출 - 이름 인덱싱

product <- list(id="A001", name="Mouse", price=30000) #list()함수로 3개의 원소에 이름을 지정하여 리스트 생성 
product                                  #리스트 변수 product 출력
## $id
## [1] "A001"
## 
## $name
## [1] "Mouse"
## 
## $price
## [1] 30000
product[c("name", "price")]              #원소의 이름이 name과 price인 원소를 리스트 형식으로 출력                     
## $name
## [1] "Mouse"
## 
## $price
## [1] 30000
product["name"]                          #원소의 이름이 name인 원소를 리스트 형식으로 출력
## $name
## [1] "Mouse"

존재하지 않는 원소에 대한 인덱싱

product[["fourth"]]                      #원소의 이름이 forth인 원소 그 자체를 출력
## NULL
product$fourth                           #원소의 이름이 forth인 원소 그 자체를 출력
## NULL
# product[[4]]    # error: out of bounds #4번째 위치에 있는 원소 그 자체를 출력
product[c(4,2,5)]
## $<NA>
## NULL
## 
## $name
## [1] "Mouse"
## 
## $<NA>
## NULL
product[c("fourth", "name", "fifth")]    # error #원소의 이름이 fourth, name, fifth인 원소를 list형식으로 출력
## $<NA>
## NULL
## 
## $name
## [1] "Mouse"
## 
## $<NA>
## NULL

[[]]와 $의 차이: [[]]은 computed index 기능

x <- list(foo=1:4, bar=0.6, baz="hello")
name <- "foo"
x[[name]]    # computed index for 'foo'
## [1] 1 2 3 4
x$name       # element 'name' doesn't exist!
## NULL
x$foo
## [1] 1 2 3 4

중첩 리스트

lst <- list(one=1, two=2, three=list(alpha=3.1, beta=3.2)) #원소로 리스트를 갖는 리스트 lst를 생성 
lst
## $one
## [1] 1
## 
## $two
## [1] 2
## 
## $three
## $three$alpha
## [1] 3.1
## 
## $three$beta
## [1] 3.2
lst[["three"]]           # 리스트 lst내 이름 three를 갖는 원소 그 자체를 출력, 원소 그 자체는 리스트임 
## $alpha
## [1] 3.1
## 
## $beta
## [1] 3.2
lst$three                # 리스트 lst내 이름 three를 갖는 원소 그 자체를 출력, 원소 그 자체는 리스트임
## $alpha
## [1] 3.1
## 
## $beta
## [1] 3.2
lst[["three"]][["beta"]] # 리스트 lst내 이름 three를 갖는 원소내 이름 beta를 갖는 원소를 출력 
## [1] 3.2
lst[[c("three","beta")]] # 리스트 lst내 이름 three를 갖는 원소내 이름 beta를 갖는 원소를 출력
## [1] 3.2
lst$three$beta           # 리스트 lst내 이름 three를 갖는 원소내 이름 beta를 갖는 원소를 출력 
## [1] 3.2
lst[["three"]]["beta"]   # 리스트 lst내 이름 three를 갖는 원소내 이름 beta를 갖는 원소를 list형식으로 출력
## $beta
## [1] 3.2
x <- list(a=list(10, 12, 14), b=c(3.14, 2.81))
x[[c(1,3)]]
## [1] 14
x[[1]][[3]]
## [1] 14
x[[c(2,1)]]
## [1] 3.14

4.3 리스트 다루기

1개 원소에 하나의 값 할당 - [[]] 혹은 []

product <- list(id="A001", name="Mouse", price=30000)
product[[3]] <- 40000        #리스트변수 product내 3번째 원소에 4000을 할당 
product[["price"]] <- 40000  #리스트변수 product내 이름 "price"를 갖는 원소에 4000을 할당
product$price <- 40000       #리스트변수 product내 이름 "price"를 갖는 원소에 4000을 할당
product
## $id
## [1] "A001"
## 
## $name
## [1] "Mouse"
## 
## $price
## [1] 40000
# 변칙!! 시험x!  외우지는 말고! 괜히 헷갈릴 수 있음!
product[3] <- 40000          #1개 원소 변경시에는 [[ ]], [] 모두 동일 결과(위와 결과와 같음) 
product["price"] <- 40000    #1개 원소 변경시에는 [[ ]], [] 모두 동일 결과(위의 결과와 같음)
product
## $id
## [1] "A001"
## 
## $name
## [1] "Mouse"
## 
## $price
## [1] 40000

1개 원소에 여러 개의 값 할당 - [[]] 혹은 $ 이용

product <- list(id="A001", name="Mouse", price=30000)
product[[3]] <- c(40000, 50000)     # [[ ]]를 이용하여 1개 원소에 벡터 형식 값 할당 가능
product$price <- c(40000, 50000)    # $를 이용하여 1개 원소에 벡터 형식 값 할당 가능

product[3] <- list(c(40000, 50000)) # [ ]를 이용하여 1개 원소에 값을 할당시 list로 변환하여 할당 가능 
product
## $id
## [1] "A001"
## 
## $name
## [1] "Mouse"
## 
## $price
## [1] 40000 50000

2개 이상의 원소에 값 할당 - [] 이용

product <- list(id="A001", name="Mouse", price=c(4000, 5000))
product[1:3] <- list("A002", "Keyboard", 90000) # 첫번째, 두번째째, 세번째 위치의 원소에 오른쪽 list내 값을 각각 할당 
product
## $id
## [1] "A002"
## 
## $name
## [1] "Keyboard"
## 
## $price
## [1] 90000

1개 원소의 추가 - [[]] 이용시

product <- list(id="A001", name="Mouse", price=c(4000, 5000))
product[1:3] <- list("A002", "Keyboard", 90000) 
product[[4]] <- c("Domestic", "Export")         # 4번째 위치에 신규 원소 추가 
product
## $id
## [1] "A002"
## 
## $name
## [1] "Keyboard"
## 
## $price
## [1] 90000
## 
## [[4]]
## [1] "Domestic" "Export"

1개 원소의 추가 - $ 이용시

product <- list(id="A001", name="Mouse", price=c(4000, 5000))
product[1:3] <- list("A002", "Keyboard", 90000) 
product[[4]] <- c("Domestic", "Export") 

product$madein <- c("Korea", "China")          # 원소이름으로 madein을 추가하고, 여기에 문자벡터를 할당
product[["madein"]] <- c("Korea", "China")     # 원소이름으로 madein을 추가하고, 여기에 문자벡터를 할당

product["madein"] <- list(c("Korea", "China")) # 원소이름으로 madein을 추가하고, 여기에 문자벡터를 할당
product
## $id
## [1] "A002"
## 
## $name
## [1] "Keyboard"
## 
## $price
## [1] 90000
## 
## [[4]]
## [1] "Domestic" "Export"  
## 
## $madein
## [1] "Korea" "China"

여러개의 원소 추가 - []를 이용, 위치인덱스

product <- list(id="A001", name="Mouse", price=c(4000, 5000))
product[1:3] <- list("A002", "Keyboard", 90000) 
product[[4]] <- c("Domestic", "Export") 
product$madein <- c("Korea", "China")         
product[6:9] <- list(0.12,0.15, 0.22, 0.27)    # 4개의 새로운 원소 추가 
product[6:9] <- c(0.12,0.15, 0.22, 0.27)       # 할당하고자 하는 값이 동일한 자료형이면 list형식이 아닌 벡터형식도 가능 
product
## $id
## [1] "A002"
## 
## $name
## [1] "Keyboard"
## 
## $price
## [1] 90000
## 
## [[4]]
## [1] "Domestic" "Export"  
## 
## $madein
## [1] "Korea" "China"
## 
## [[6]]
## [1] 0.12
## 
## [[7]]
## [1] 0.15
## 
## [[8]]
## [1] 0.22
## 
## [[9]]
## [1] 0.27

여러 개의 원소 추가 - []를 이용, 이름 인덱스

names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
values <- list(842,729,786,751,844,851,702)
values <- c(842,729,786,751,844,851,702) # 할당하고자 하는 값이 동일한 자료형이면 list형식이 아닌 벡터형식도 가능
traffic.death <- list()
traffic.death
## list()
traffic.death[names] <- values  
traffic.death
## $Mon
## [1] 842
## 
## $Tue
## [1] 729
## 
## $Wed
## [1] 786
## 
## $Thu
## [1] 751
## 
## $Fri
## [1] 844
## 
## $Sat
## [1] 851
## 
## $Sun
## [1] 702

1개 원소의 제거 - [[]]이용, NULL을 할당

names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
values <- c(842,729,786,751,844,851,702) 
traffic.death <- list()
traffic.death[names] <- values  
traffic.death[["Fri"]] <- NULL
traffic.death
## $Mon
## [1] 842
## 
## $Tue
## [1] 729
## 
## $Wed
## [1] 786
## 
## $Thu
## [1] 751
## 
## $Sat
## [1] 851
## 
## $Sun
## [1] 702

여러개 원소의 제거 - []이용, NULL을 할당

names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
values <- list(842,729,786,751,844,851,702) 
traffic.death[names] <- values 
traffic.death[["Fri"]] <- NULL
traffic.death[c("Sat", "Sun")] <- NULL
traffic.death
## $Mon
## [1] 842
## 
## $Tue
## [1] 729
## 
## $Wed
## [1] 786
## 
## $Thu
## [1] 751

여러개 원소의 제거 - []내 논리벡터 적용, NULL을 할당

names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
values <- list(842,729,786,751,844,851,702) 
traffic.death[names] <- values  
traffic.death[names] <- values 
traffic.death[["Fri"]] <- NULL
traffic.death[c("Sat", "Sun")] <- NULL
traffic.death < 750                
##   Mon   Tue   Wed   Thu 
## FALSE  TRUE FALSE FALSE
traffic.death[traffic.death < 750] <- NULL  #논리값 벡터로 [ ]내 대상 원소들을 지정 
traffic.death
## $Mon
## [1] 842
## 
## $Wed
## [1] 786
## 
## $Thu
## [1] 751

리스트의 결합 - c() 함수 이용

worldcup1 <- list("Brazil", "South Africa", "Germany")
worldcup2 <- list("Korea", "France", "USA")
c(worldcup1, worldcup2)
## [[1]]
## [1] "Brazil"
## 
## [[2]]
## [1] "South Africa"
## 
## [[3]]
## [1] "Germany"
## 
## [[4]]
## [1] "Korea"
## 
## [[5]]
## [1] "France"
## 
## [[6]]
## [1] "USA"

수학함수 이용을 위한, 리스트에서 벡터로의 변환 - unlist() 함수 이용

rainfall <- list(21.6,23.6,45.8,77.0,102.2,133.3,
                 327.9,348.0,137.6,49.3,53.0,24.9)
mean(rainfall)
## Warning in mean.default(rainfall): argument is not numeric or logical: returning
## NA
## [1] NA
mean(unlist(rainfall))
## [1] 112.0167
min(unlist(rainfall))
## [1] 21.6
max(unlist(rainfall))
## [1] 348