728x90
반응형

저번 포스트에선 행렬 생성과 행과 열의 이름 변경, 행렬의 정보 얻기 등을 공부해보았다.
이번 포스트에선 행렬 데이터 접근, 행렬의 연산에 대해 학습해보자.

 

행렬 데이터 접근하기

  • 행렬은 색인 또는 행과 열의 이름을 통해서 접근할 수 있다.
  • 행렬은 벡터와 같게 [] 대괄호를 이용해서 데이터에 접근한다.
  • 단 행렬은 벡터와 다르게 2개의 차원인 행(Row), 열(Column)으로 구성되어 있으므로, 2개의 index를 부여해야한다.
  • Matrix[행index,열index]로 행렬 데이터에 접근할 수 있다.
  • Indexing 예시는 다음과 같다.
    • Matrix[row_id, col_id]
      : 행렬의 row_id 행과 col_id 열에 지정된 값을 가지고 온다. 이 때, row_id나 col_id에 벡터를 사용하여 여러 값을 지정할 수 있다. row_id나 col_id 둘 중 하나를 생략하면 전체 행이나 열을 뜻한다.
    • Matrix[1:3,]
      : 1~3 행의 데이터를 가지고 온다.
    • Matrix[-3,]
      : 3행의 데이터를 제외하고 모두 가지고 온다.
    • Matrix[c(1,3),]
      : 1, 3 행만 가지고 온다.
    • Matrix[,c("col5", "col3")]
      : 행렬 또한 행과 열에 부여된 이름으로 불러올 수 있다.

      ※ 접근한 행렬의 색인이나 이름의 순서에 따라서 행렬의 배열은 바뀌게 된다!
# 행렬에서 내가 원하는 데이터만 가지고 와보자.
vt = c(80, 60, 70, 75,
       90, 70, 60, 60,
       85, 90, 40, 70,
       80, 75, 90, 80,
       85, 80, 70, 65)
mat <- matrix(vt, nrow = 5, byrow = TRUE, dimnames = list(c("민철", "재성", "기훈", "재빈", "현희"), c("수학", "영어", "국어", "탐구")))
mat

※ 행렬과 같은 형태로 벡터를 생성한다면, 행렬 생성이 보다 편리하다.

##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 재성   90   70   60   60
## 기훈   85   90   40   70
## 재빈   80   75   90   80
## 현희   85   80   70   65
# 행렬에서 민철, 기훈, 현희의 수학 점수와 국어 점수를 가지고 와보자..
mat[c("민철", "기훈", "현희"), c("수학", "국어")]
##      수학 국어
## 민철   80   70
## 기훈   85   40
## 현희   85   70
# 행렬에서 2번 행부터 4번 행까지 가지고 와보자.
mat[2:4,]
##      수학 영어 국어 탐구
## 재성   90   70   60   60
## 기훈   85   90   40   70
## 재빈   80   75   90   80
# 행렬에서 3번째 행만 제외하고 가지고 와보자.
mat[-3,]
##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 재성   90   70   60   60
## 재빈   80   75   90   80
## 현희   85   80   70   65
# 행렬에서 1, 3 행만 가지고 와보자.
mat[c(1,3),]
##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 기훈   85   90   40   70
# 행렬에서 국어 점수와 수학 점수 순서로 가지고 와보자.
mat[,c("국어", "수학")]
##      국어 수학
## 민철   70   80
## 재성   60   90
## 기훈   40   85
## 재빈   90   80
## 현희   70   85

 

 

 

 

행렬의 연산

: 행렬 내부에서 할 수 있는 연산과 행렬과 스칼라 간의 연산, 행렬과 행렬 간의 연산에 대해 알아보자.

행렬 내 연산

  • rowMeans() / colMeans()
    : 행의 평균을 구한다. / 열의 평균을 구한다.
  • rowSums() / colSums()
    : 행의 합을 구한다. / 열의 합을 구한다.
  • 위 행렬을 기반으로 실습을 해보자.
    ※ Indexing과 조합하여 내가 원하는 값만 가지고 와서 연산해보도록 하자.
# 위 행렬이 1반이라고 가정할 때, 1반 학생들 개개인의 총 점수를 구하자.
rowSums(mat)
## 민철 재성 기훈 재빈 현희 
##  285  280  285  325  300
# 1 반 학생들의 과목별 평균 점수를 구하자.
colMeans(mat)
## 수학 영어 국어 탐구 
##   84   75   66   70
# 민철, 기훈, 현희의 평균 점수를 구하자.
rowMeans(mat[c("민철", "기훈", "재빈"),])
##  민철  기훈  재빈 
## 71.25 71.25 81.25
# 재성, 재빈, 현희의 수학, 국어 점수의 평균 점수를 구하자.
rowMeans(mat[c("재성", "재빈", "현희"),c("수학", "국어")])
## 재성 재빈 현희 
## 75.0 85.0 77.5
# 1반의 수학 총점과 평균 점수를 구하자.
math_Vt = mat[,"수학"]
sum(math_Vt)
## [1] 420
mean(math_Vt)
## [1] 84

 

 

행렬과 스칼라 간의 연산

  • 행렬과 스칼라 간의 연산은 아주 간단하다.
  • + - * / ^ 등을 그대로 사용하면 된다.
mat1 = matrix(c(1:12), nrow = 3, byrow = TRUE)
mat1 + 10
##      [,1] [,2] [,3] [,4]
## [1,]   11   12   13   14
## [2,]   15   16   17   18
## [3,]   19   20   21   22
mat1 - 10
##      [,1] [,2] [,3] [,4]
## [1,]   -9   -8   -7   -6
## [2,]   -5   -4   -3   -2
## [3,]   -1    0    1    2
mat1 * 10
##      [,1] [,2] [,3] [,4]
## [1,]   10   20   30   40
## [2,]   50   60   70   80
## [3,]   90  100  110  120
mat1 / 10
##      [,1] [,2] [,3] [,4]
## [1,]  0.1  0.2  0.3  0.4
## [2,]  0.5  0.6  0.7  0.8
## [3,]  0.9  1.0  1.1  1.2

 

 

행렬과 행렬의 연산

  • 행렬과 행렬의 연산은 다양한 전제 조건이 붙는다.
  • 행렬의 합과 차를 하려면 두 행렬의 크기가 서로 같아야 하며, 행렬의 곱을 하려면 앞 행렬과 뒤 행렬의 열과 행의 수가 동일해야한다. 
  • 행렬의 합과 차는 +, -로 기존 연산자와 동일하나 행렬간 곱은 %*%로 연산자가 다르다.
  • 전치행렬을 이용하면 언제든지 행렬 곱을 할 수 있다.
    • 전치행렬은 각 원소의 행과 열을 바꾼 행렬로, 어떤 크기의 행렬이라도 전치 행렬을 만들 수 있다.
    • 전치 행렬은 행과 열을 교환한 것이므로, 언제든지 행렬곱을 할 수 있다.
      보다 엄밀히 말하면, 주대각선을 축으로 하는 반사 대칭을 가하여 얻은 행렬이라고 할 수 있다.
    • 전치 행렬은 t(행렬)을 하면 생성할 수 있다.
mat1 = matrix(c(1:12), nrow = 3, byrow = TRUE)
mat2 = matrix(c(12:1), nrow = 3, byrow = TRUE)

# 행렬간 합과 차를 해보자
mat1 + mat2
##      [,1] [,2] [,3] [,4]
## [1,]   13   13   13   13
## [2,]   13   13   13   13
## [3,]   13   13   13   13
mat1 - mat2
##      [,1] [,2] [,3] [,4]
## [1,]  -11   -9   -7   -5
## [2,]   -3   -1    1    3
## [3,]    5    7    9   11
# 전치행렬 곱을 해보자
mat1 %*%t(mat1)
##      [,1] [,2] [,3]
## [1,]   30   70  110
## [2,]   70  174  278
## [3,]  110  278  446

 

 

 

이번 포스트에서는 행렬의 Indexing과 행렬의 연산 등에 대하여 학습해보았다.

다음 포스트에선 역행렬을 비롯한 약간 독특한 형태의 행렬들에 대해 가볍게 학습해보자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 배열(Array)  (0) 2020.06.19
R(기초) 행렬(Matrix)(3부)  (0) 2020.06.19
R(기초) 행렬(Matrix)(1부)  (0) 2020.06.18
R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18

+ Recent posts