새소식

강의 및 세미나 자료/R

R 핵심만 배우기 #2 - 리스트, 메트릭스, 배열

  • -
R 핵심 문법 #2 - 리스트, 메트릭스, 배열

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

  1. 다음과 같은 score_lst 라는 이름의 리스트를 만들어라
## $name
## [1] "호돌2"
## 
## $score
## [1] 1 2 3
  1. 만든 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. 두 행렬의 행렬곱은? (참고 : 두 행렬의 차원을 잘 맞춰야함)
##      [,1] [,2] [,3]
## [1,]   -1    6   -1
## [2,]    1    6   -2
  1. 두 행렬 곱으로 얻어진 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


Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.