59doit
[ R ] Matrix & Array 자료 구조 본문
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 |