3.2 R 행렬 Matrix

동일한 형태의 데이터가 2차원으로 구성된 데이터 구조입니다. 표처럼 m × n 형태로 이루어진 데이터 구조입니다.

3.2.1 행렬 생성

3.2.1.1 matrix()를 사용하여 행렬 생성

# 1부터 12까지의 숫자를 3개열 형태의 행렬로 만들어 변수 m1에 할당
# ncol : 열의 수
m1 <- matrix(1:12, ncol = 3)
m1
#>      [,1] [,2] [,3]
#> [1,]    1    5    9
#> [2,]    2    6   10
#> [3,]    3    7   11
#> [4,]    4    8   12
# nrow : 행의 수
# byrow : FALSE(기본값)이면 행렬이 열로 채워지고 그렇지 않으면 행렬이 행으로 채워짐
m2 <- matrix(
  data = c(1,2,3, 11,12,13),
  nrow = 2, byrow = TRUE
  )
m2
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]   11   12   13

3.2.1.2 cbind() 또는 rbind()를 사용하여 행렬 생성

# 숫자 벡터 생성
col1 <- c(5, 6, 7, 8, 9)
col2 <- c(2, 4, 5, 9, 8)
col3 <- c(7, 3, 4, 8, 7)
# 열 기준으로 벡터 병합 
m3 <- cbind(col1, col2, col3)
m3
#>      col1 col2 col3
#> [1,]    5    2    7
#> [2,]    6    4    3
#> [3,]    7    5    4
#> [4,]    8    9    8
#> [5,]    9    8    7

3.2.2 행렬 이름 붙이기

3.2.2.1 rownames() 또는 colnames()를 사용하여 이름 붙이기

rownames(m3) <- c("행1", "행2", "행3", "행4", "행5")
colnames(m3) <- c("열1", "열2", "열3")
m3
#>     열1 열2 열3
#> 행1   5   2   7
#> 행2   6   4   3
#> 행3   7   5   4
#> 행4   8   9   8
#> 행5   9   8   7

3.2.2.2 matrix()의 dimnames 속성을 이용하여 이름 붙이기

m4 <- matrix(
  data = c(1,2,3, 11,12,13),
  nrow = 2, byrow = TRUE,
  dimnames = list(c("행1", "행2"), c("일열", "이열", "삼열"))
  )
m4
#>     일열 이열 삼열
#> 행1    1    2    3
#> 행2   11   12   13

3.2.3 행열 바꾸기

t(m2)
#>      [,1] [,2]
#> [1,]    1   11
#> [2,]    2   12
#> [3,]    3   13

3.2.4 행렬의 차원

# 행의 갯수
nrow(m3)
#> [1] 5

# 열의 갯수
ncol(m3)
#> [1] 3

# 행과 열이 갯수
dim(m3)
#> [1] 5 3

3.2.5 행렬의 요소 추출

3.2.5.1 특정 위치에 있는 요소 추출

# 2번째 행에 있는 요소 추출
m3[2,]
#> 열1 열2 열3 
#>   6   4   3
# 2행 3열에 있는 요소 추출
m3[2, 3]
#> [1] 3
# 2행에서 3행 추출
m3[2:3,]
#>     열1 열2 열3
#> 행2   6   4   3
#> 행3   7   5   4
# 2행과 5행 추출
m3[c(2,5),]
#>     열1 열2 열3
#> 행2   6   4   3
#> 행5   9   8   7

3.2.5.2 행렬 이름으로 요소 추출

# 두번째 열 추출
m3[, "열2"]
#> 행1 행2 행3 행4 행5 
#>   2   4   5   9   8
# 세번째 행 추출
m3["행3",]
#> 열1 열2 열3 
#>   7   5   4

3.2.5.3 마이너스 기호(-)를 이용하여 요소 제외

# 2행과 2열 제외
m3[-2, -2]
#>     열1 열3
#> 행1   5   7
#> 행3   7   4
#> 행4   8   8
#> 행5   9   7

3.2.5.4 조건으로 요소 추출

# 3열의 값이 5이상인 경우 추출
col3 <- m3[, 3]
m3[col3 >= 5,]
#>     열1 열2 열3
#> 행1   5   2   7
#> 행4   8   9   8
#> 행5   9   8   7
# 5보다 큰 수 모두 추출
m3[m3 > 5]
#> [1] 6 7 8 9 9 8 7 8 7

# 짝수만 추출
m3[m3 %% 2 == 0]
#> [1] 6 8 2 4 8 4 8

3.2.6 행렬 요소 수정

# 하나의 요소 값 수정
mm <- m3; mm
#>     열1 열2 열3
#> 행1   5   2   7
#> 행2   6   4   3
#> 행3   7   5   4
#> 행4   8   9   8
#> 행5   9   8   7
mm[2, 2] <- 9; mm
#>     열1 열2 열3
#> 행1   5   2   7
#> 행2   6   9   3
#> 행3   7   5   4
#> 행4   8   9   8
#> 행5   9   8   7
# 5미만 인 경우 0으로 수정
mm[mm < 6] <- 0; mm
#>     열1 열2 열3
#> 행1   0   0   7
#> 행2   6   9   0
#> 행3   7   0   0
#> 행4   8   9   8
#> 행5   9   8   7

3.2.7 행렬 연산

m1 * 2
#>      [,1] [,2] [,3]
#> [1,]    2   10   18
#> [2,]    4   12   20
#> [3,]    6   14   22
#> [4,]    8   16   24
log2(m1)
#>      [,1] [,2] [,3]
#> [1,] 0.00 2.32 3.17
#> [2,] 1.00 2.58 3.32
#> [3,] 1.58 2.81 3.46
#> [4,] 2.00 3.00 3.58
# 행합계 rowSums() 
rowSums(m3)
#> 행1 행2 행3 행4 행5 
#>  14  13  16  25  24

# 열합계 colSums()
colSums(m3)
#> 열1 열2 열3 
#>  35  28  29
# 행 평균
apply(m3, 1, mean)
#>  행1  행2  행3  행4  행5 
#> 4.67 4.33 5.33 8.33 8.00

# 열 평균
apply(m3, 2, mean)
#> 열1 열2 열3 
#> 7.0 5.6 5.8
  • 행렬곱 %*%

행열간의 곱하기는 수학적으로 곱이 가능한 형태를 갖는 행렬만이 가능합니다.

x <- matrix(1:9, nrow = 3)
y <- matrix(11:19, nrow = 3)
x %*% y
#>      [,1] [,2] [,3]
#> [1,]  150  186  222
#> [2,]  186  231  276
#> [3,]  222  276  330