59doit

[ R ] Matrix & Array 자료 구조 본문

Programming/R

[ R ] Matrix & Array 자료 구조

yul_S2 2022. 11. 15. 10:40
반응형

Matrix 자료 구조

  • 행렬(Matrix) 자료구조
  • 2차원
  • 동일한 타입의 데이터만 저장 가능 행렬 생성 함수: matrix(), rbind(), cbind() 행렬
  • 자료 처리 함수: apply()

 

(1) 벡터   행렬   객체   생성

 

 

ex )  행렬 객체 생성

m <- matrix(c(1:5))
m
#       [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4
# [5,]    5

 

 

ex ) 열 우선으로 행렬 객체 생성

  • nrow = 2  > 행의 수 : 2
m <- matrix(c(1:10), nrow = 2)
m
#       [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    5    7    9
# [2,]    2    4    6    8   10

 

 

ex ) 행과 열의 수가 불일치

m <- matrix(c(1:11), nrow = 2)
# Warning message:
  In matrix(c(1:11), nrow = 2) :
  data length [11] is not a sub-multiple or multiple of the number of rows [2]

m
#       [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    3    5    7    9   11
# [2,]    2    4    6    8   10    1

matrix 생성 시 행과 열의 수가 불일치 --> 경고 --> 모자라는 데이터는 첫번째 데이터로부터 재사용

 

 

 

ex ) 행 우선으로 행렬 객체 생성

  • byrow = T: 행 우선으로 배열
m <- matrix(c(1:10), nrow = 2, byrow = T)
m
#      [,1]  [,2]  [,3] [,4] [,5]
# [1,]    1    2    3    4    5
# [2,]    6    7    8    9   10

 

 

(2) 행   또는   열   묶음으로    행렬   생성 

  • rbind()함수 : 행 묶음
  • cbind()함수 : 열 묶음

ex ) 행 묶음

x1 <- c(m, 40, 50:52)
x2 <- c(30, 5, 6:8)
mr <- rbind(x1, x2)
mr
#    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
# x1    1    6    2    7    3    8    4    9    5    10    40    50    51    52
# x2   30    5    6    7    8   30    5    6    7     8    30     5     6     7

 

 

 

 

ex ) 열 묶음

mc <- cbind(x1, x2)
mc
#      x1 x2
# [1,]  1 30
# [2,]  6  5
# [3,]  2  6
# [4,]  7  7
# [5,]  3  8
# [6,]  8 30
# [7,]  4  5
# [8,]  9  6
# [9,]  5  7
# [10,] 10  8
# [11,] 40 30
# [12,] 50  5
# [13,] 51  6
# [14,] 52  7

 

 

 

 

 

(3) matrix()함수   이용   행렬    생성 

marix(data=NA, nrow=1, ncol=1, byrow=FALSE, dimnames =NULL)

ex ) 2행으로 행렬 생성

m3 <- matrix(10:19, 2)
m4 <- matrix(10:20, 2)
Warning message:
#   In matrix(10:20, 2) :
#   data length [11] is not a sub-multiple or multiple of the number of rows [2]

m3  
#        [,1]  [,2]  [,3]  [,4]  [,5]
# [1,]   10   12   14   16   18
# [2,]   11   13   15   17   19

mode(m3); class(m3)  
# [1] "numeric"
# [1] "matrix" "array" 

 

 

 

 

ex ) index이용 행렬에 접근

  • 변수명[행 index, 열 index] 
  • 특정 행 접근: 변수명[행 index,] 
  • 특정 열 접근: 변수명[,열 indx]
m3[1, ]
# [1] 10 12 14 16 18

m3[ , 5]
# [1] 18 19

m3[2, 3]
# [1] 15

m3[1, c(2:5)]
# [1] 12 14 16 18

 

 

 

ex ) 3행 3열 행렬 생성

x <- matrix(c(1:9), nrow = 3, ncol = 3)
x
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9

cf) 행 우선으로 배열 생성 시 byrow = T 속성 추가

 

 

(4)행렬   객체   자료   처리    함수

ex ) 자료의 개수

length(x)
# [1] 9

ncol(x)
# [1] 3
  • length()함수: 행렬의 전체 원소 개수
  • ncol()함수: 열의 수
  • nrow()함수: 행의 수

 

ex ) apply()함수

  • 형식: apply(X, MARGIN, FUN, ...) 
  • where X: 행렬
  • MARGIN: 1(행 단위) or 2(열 단위)
  • FUN: 행렬에 적용할 함수(function)
apply(x, 1, max)
# [1] 7 8 9

apply(x, 1, min)
# [1] 1 2 3

apply(x, 2, mean)
# [1] 2 5 8

행별(서로 같은 행끼리) max값

 

행별(서로 같은 행끼리) min값

 

열별(서로 같은 열끼리) mean값

 

 

ex ) 사용자 정의 함수 적용

function(x) { }

전치행렬: 행렬의 행과 열의 구조가 서로 바뀐 행렬

 

 

ex ) 사용자 정의 함수 적용하기

# x
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9

f <- function(x) {  x * c(1, 2, 3)  }        # 1행에 1을 곱하고 2행에 2를 곱하고 3행에 3을 곱함
f(x)                                                     # 사용자 정의 적용보기
#      [,1]  [,2]  [,3]
# [1,]    1    4    7
# [2,]    4   10   16
# [3,]    9   18   27                                              

 

 

ex ) 행 우선 순서로 사용자 정의 함수 적용

result <- apply(x, 1, f)
result
#      [,1]  [,2]  [,3]
# [1,]    1    2    3
# [2,]    8   10   12
# [3,]   21   24   27

처음 x정의 할때  " x <- matrix(c(1:9), nrow = 3, ncol = 3) " 로 정의 하였으므로 열 단위로 우선 배열 한다.

apply()함수 형식에 의하여 apply(X, MARGIN, FUN, ...)   " apply(x, 1, f) " 에서 1은 행단위로 연산한다.

결과값은 열단위로 배열하되 연산은 행단위로 연산된 결과값을 얻게된다.

 

 

ex ) 열 우선 순서로 사용자 정의 함수 적용

result <- apply(x, 2, f)
result
#      [,1]  [,2]  [,3]
# [1,]    1    4    7
# [2,]    4   10   16
# [3,]    9   18   27

처음 x정의 할때  " x <- matrix(c(1:9), nrow = 3, ncol = 3) " 로 정의 하였으므로 열 단위로 우선 배열 한다.

apply()함수 형식에 의하여 apply(X, MARGIN, FUN, ...)   " apply(x, 2, f) " 에서 2는 열단위로 연산한다.

결과값은 열단위로 배열하고 연산도 열단위로 연산된 결과값을 얻게된다.

 

 

ex ) 행렬에 컬럼명 지정

  • colnames()함수
colnames(x) <- c("one", "two", "three")
x
#      one two three
# [1,]   1   4     7
# [2,]   2   5     8
# [3,]   3   6     9

 

 

 

 

Array자료 구조

  • 3차원 배열 형태
  • 배열 생성 함수: array()

 

ex )  배열 객체 생성

vec <- c(1:12)
arr <- array(vec, c(3, 2, 2))
arr
# , , 1

# [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6

# , , 2

# [,1] [,2]
# [1,]    7   10
# [2,]    8   11
# [3,]    9   12

 

 

ex )  배열 객체의 자료 조회

arr[ , , 1]
#      [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6

arr[ , , 2]
#      [,1] [,2]
# [1,]    7   10
# [2,]    8   11
# [3,]    9   12

mode(arr); class(arr)
# [1] "numeric"
# [1] "array"

 

 

ex ) 데이터 셋 가져오기

install.packages("RSADBE")
library(RSADBE)
data("Bug_Metrics_Software")

 

 

ex ) 데이터 셋 구조

str(Bug_Metrics_Software)

# 'xtabs' num [1:5, 1:5, 1:2] 11605 5803 325 1714 14577 ...
# - attr(*, "dimnames")=List of 3
# ..$ Software: chr [1:5] "JDT" "PDE" "Equinox" "Lucene" ...
# ..$ Bugs    : chr [1:5] "Bugs" "NT.Bugs" "Major" "Critical" ...
# ..$ BA_Ind  : chr [1:2] "Before" "After"
# - attr(*, "call")= language xtabs(formula = T.freq ~ Software + Bugs + BA_Ind, data = T.Table)

 

 

 

 

ex ) 데이터 셋 자료 보기

Bug_Metrics_Software

# , , BA_Ind = Before

# Bugs
# Software   Bugs NT.Bugs Major Critical H.Priority
# JDT     11605   10119  1135      432        459
# PDE      5803    4191   362      100         96
# Equinox   325    1393   156       71         14
# Lucene   1714    1714     0        0          0
# Mylyn   14577    6806   592      235       8804

# , , BA_Ind = After

# Bugs
# Software   Bugs NT.Bugs Major Critical H.Priority
# JDT       374      17    35       10          3
# PDE       341      14    57        6          0
# Equinox   244       3     4        1          0
# Lucene     97       0     0        0          0
# Mylyn     340     187    18        3         36

 

반응형

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

[ R ] List 자료구조 & 문자열처리  (0) 2022.11.16
[ R ] DataFrame 자료구조  (0) 2022.11.15
[ R ] vector 자료구조  (0) 2022.11.15
[ R ] 함수사용  (0) 2022.11.14
[ R ] 변수 & 자료형  (0) 2022.11.14
Comments