강의 및 세미나 자료/R
R 핵심만 배우기 #2 - 리스트, 메트릭스, 배열
- -
R 핵심 문법 #2 - 리스트, 메트릭스, 배열
호돌2
2017년 10월 29일
R 기초 두번째
두번째 시간입니다. 이번 시간에는 리스트와 메트릭스에 대해서 알아보겠습니다.
list에 대해 알아봅시다
list는 vector 처럼 여러 원소를 담을 수 있는 그릇인데, vector와 가장 큰 차이점은 여러가지 자료형 원소도 함께 담을 수 있다는 점입니다.
lst <- list(3.14, 'hello',TRUE)
lst
## [[1]]
## [1] 3.14
##
## [[2]]
## [1] "hello"
##
## [[3]]
## [1] TRUE
lst <- list('apple',c(1,2,3)) #list 안에 벡터도 담을 수 있다.
lst
## [[1]]
## [1] "apple"
##
## [[2]]
## [1] 1 2 3
벡터와 마찬가지로 이름을 설정할 수 있습니다.
names(lst) <- c('과일','벡터')
lst
## $과일
## [1] "apple"
##
## $벡터
## [1] 1 2 3
아래와 같이 리스트를 생성하는 단계부터 각 원소에 이름을 붙일 수도 있습니다.
lst <- list(name ="apple", price =100, inventory = TRUE)
lst
## $name
## [1] "apple"
##
## $price
## [1] 100
##
## $inventory
## [1] TRUE
- list 원소 선택하기
#이름이 달려있는 경우
lst <- list(name ="apple", price =100, inventory = TRUE)
lst$name
## [1] "apple"
#index로 접근하는 방법
lst[[1]]
## [1] "apple"
lst[1]
## $name
## [1] "apple"
lst[c(1,3)]
## $name
## [1] "apple"
##
## $inventory
## [1] TRUE
#아래 둘의 차이는?
#lst[1] / lst[[1]]
class(lst[[1]]) #원소가 반환된다
## [1] "character"
class(lst[1]) #다시 list가 반환된다
## [1] "list"
- 빈 list에 원소 추가하기
lst <- list()
lst
## list()
lst[[1]] <- 100
lst[[2]] <- 'apple'
lst['inventory'] <- TRUE
lst
## [[1]]
## [1] 100
##
## [[2]]
## [1] "apple"
##
## $inventory
## [1] TRUE
- list 에서 원소 제거하기
lst['inventory'] <- NULL #NULL 값을 할당해주면 없어진다
lst
Quiz
다음과 같은 lst가 있다.
lst <- list(1,2,3)
1)위 lst에 아래와 같이 벡터 (‘a’,‘b’,‘c’)를 추가
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
##
## [[4]]
## [1] "a" "b" "c"
2)lst 에서 1)에서 추가한 c(‘a’,‘b’,‘c’)를 제거
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
- list를 원소의 평균 구하기
## 다음 리스트 원소의 평균을 계산하고 싶으면
## mean() 함수를 사용하면 되는데, list에 대해서는 오류가 발생.
lst <-list(1,2,3,4,5)
mean(lst)
## Warning in mean.default(lst): argument is not numeric or logical: returning
## NA
## [1] NA
unlist(lst)
## [1] 1 2 3 4 5
mean(unlist(lst))
## [1] 3
cat('list element is : ', unlist(lst))
## list element is : 1 2 3 4 5
Quiz
다음 list의 평균, 최소, 최댓값 계산하시오
lst <-list(1,2,3,4,5)
## [1] 3
## [1] 1
## [1] 5
Quiz
- 다음과 같은 score_lst 라는 이름의 리스트를 만들어라
## $name
## [1] "호돌2"
##
## $score
## [1] 1 2 3
- 만든 score_lst에 id ’1234’를 추가하여라
## $name
## [1] "호돌2"
##
## $score
## [1] 1 2 3
##
## $id
## [1] "1234"
matrix에 대해 알아봅시다
matrix는 우리가 알고 있듯이 2차원의 데이터를 담을 수 있고, vector와 유사하게 같은 타입만 담을 수 있습니다.
matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9) , nrow =3, ncol=3)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
#동일하게
vec <- c(1, 2, 3,
4, 5, 6,
7, 8, 9)
m <- matrix(vec, 3,3)
매트릭스도 벡터, 리스트와 마찬가지로 column, row 의 이름을 지정할 수 있습니다.
colnames(m) <- c('col1','col2','col3')
m
## col1 col2 col3
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
rownames(m)<- c('row1','row2','row3')
m['row1',]
## col1 col2 col3
## 1 4 7
- 매트릭스 만들기
matrix(0, 2, 3) #0으로 채우기
## [,1] [,2] [,3]
## [1,] 0 0 0
## [2,] 0 0 0
matrix(NA, 2, 3) #빈 값으로 채우기
## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA
- 매트릭스 원소 접근하기
m <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9) , nrow =3, ncol=3)
m[,3] #3번째 column
## [1] 7 8 9
m[1,2] #1번째 row, 2번째 column
## [1] 4
m[c(1,2), c(1,2)] #행의 1,2와 열 1,3에 서로 겹치는 부분
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
- matrix에 이름붙이기
m <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9) , nrow =3, ncol=3)
m
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
colnames(m) #column 이름 확인
## NULL
rownames(m) #row 이름 확인
## NULL
colnames(m) <-c('col1','col2','col3')
rownames(m) <-c('item1','item2','item3')
#붙인 이름을 통해 원소 접근하기
#item1 row 를 보고 싶으면?
m['item1',]
## col1 col2 col3
## 1 4 7
#feature2 column을 보고 싶으면?
m[,'col2']
## item1 item2 item3
## 4 5 6
- 행렬의 연산
mat1 <- matrix(seq(1:9) , nrow =3)
mat1
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
mat1 * 2 #매트릭스와 상수간의 연산
## [,1] [,2] [,3]
## [1,] 2 8 14
## [2,] 4 10 16
## [3,] 6 12 18
mat1 - 1
## [,1] [,2] [,3]
## [1,] 0 3 6
## [2,] 1 4 7
## [3,] 2 5 8
mat2 <- matrix(1, 3,3)
mat2
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 1 1 1
## [3,] 1 1 1
mat1
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
mat1 + mat2 #매트릭스와 매트릭스의 계산
## [,1] [,2] [,3]
## [1,] 2 5 8
## [2,] 3 6 9
## [3,] 4 7 10
mat2 / mat1
## [,1] [,2] [,3]
## [1,] 1.0000000 0.2500000 0.1428571
## [2,] 0.5000000 0.2000000 0.1250000
## [3,] 0.3333333 0.1666667 0.1111111
mat1 * mat2 #각 원소 간의 곱
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
mat1 %*% mat2 # 행렬 곱
## [,1] [,2] [,3]
## [1,] 12 12 12
## [2,] 15 15 15
## [3,] 18 18 18
mat1 <- matrix(seq(1:9) , nrow =3)
t(mat1) #전치행렬
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
#행렬의 차원
ncol(mat1)
## [1] 3
nrow(mat1)
## [1] 3
dim(mat1)
## [1] 3 3
Quiz
1)아래와 같은 matrix 2개를 각각 만들어라(변수명은 mat1, mat2)
## [,1] [,2]
## [1,] 1 2
## [2,] 2 1
## [,1] [,2]
## [1,] 1 -1
## [2,] 2 2
## [3,] -1 0
- 두 행렬의 행렬곱은? (참고 : 두 행렬의 차원을 잘 맞춰야함)
## [,1] [,2] [,3]
## [1,] -1 6 -1
## [2,] 1 6 -2
- 두 행렬 곱으로 얻어진 mat3에 대해 첫번째 row만 선택
## [,1] [,2] [,3]
## [1,] -1 6 -1
## [2,] 1 6 -2
## [1] -1 6 -1
참고 : array에 대해 알아봅시다
array는 잘 사용되진 않습니다. 참고로 알아두시기 바랍니다. matrix와 비슷하지만 2차원 이상의 데이터를 표현할 수 있습니다.
array(1:12,dim=c(3,4)) #3x4 matrix와 동일
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
array(1:12,dim=c(2,2,3)) #2x2 matrix가 3개 있는 형
## , , 1
##
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## , , 2
##
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
##
## , , 3
##
## [,1] [,2]
## [1,] 9 11
## [2,] 10 12
arr<-array(1:12,dim=c(2,2,3))
dim(arr)
## [1] 2 2 3
arr[1,1,]
## [1] 1 5 9
arr[,,2]
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
'강의 및 세미나 자료 > R' 카테고리의 다른 글
R로 크롤링하기 - 보배드림 예제 (20) | 2016.08.07 |
---|---|
R 핵심만 배우기 #5 - dplyr (1) | 2016.08.04 |
R 핵심만 배우기 #4 - 데이터 프레임 2번째 (5) | 2016.08.03 |
R 핵심만 배우기 #3 - 데이터 프레임(data.frame) 첫번째 (1) | 2016.08.01 |
R 핵심만 배우기 #1 - 스칼라, 요인, 벡터 (2) | 2016.08.01 |
Contents
소중한 공감 감사합니다