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
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
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