2장. 행렬


  • 행렬

R에서 행렬 역시 벡터이지만 벡터는 하나의 행 또는 열을 가지는 행렬로 취급 불가
행렬은 벡터와 달리 여러종류의 데이터값들을 요소로 가짐(비추)


  • 행렬만들기

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

R은 각 행에 먼저 데이터를 채워나감
행렬은 여전히 벡터의 일종이나, 최초선언한것과 동일한 차원유지
벡터와 마찬가지로 행렬에도 재선언을 통해서 행이나 열을 추가 가능

matrix(0,5,2)
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    0
[4,]    0    0
[5,]    0    0

matrix(NA,5,2)
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
[3,]   NA   NA
[4,]   NA   NA
[5,]   NA   NA

R은 matrix라는 클래스 제공하며, 행렬들은 dimensionality(차원)라는 속성을 가짐
길이라는 특성을 가지기 때문에 R에서 행렬은 벡터의 일종(벡터는 행렬의 일종이 아님)
행렬은 목록의 일종이기도함.

> length(x)
[1] 10
> mode(x)
[1] "numeric"
> typeof(x)
[1] "integer"
> class(x)
[1] "matrix"
> attributes(x)
$dim
[1] 2 5

> y<-c(1:10)
> length(y)
[1] 10
> mode(y)
[1] "numeric"
> typeof(y)
[1] "integer"
> class(y)
[1] "integer"
> attributes(y)
NULL


  • 행렬의 행과열 참조

행렬의 각 요소도 그들의 색인값을 사용해서 참조가능
단일 셀 뿐만 아니라 색인값에 콤마(,)를 사용하여 행 또는 열 전체 참조 가능
행과 열에 대한 색인값 뿐만 아니라 지정된 이름도 사용가능

> colnames(x) <-c("A","B","C","D","E")
> x
     A B C D  E
[1,] 1 3 5 7  9
[2,] 2 4 6 8 10
> x[1,"C"]
C
5
> x[1,2]
B
3
> x[,1]
[1] 1 2
> x[1,]
A B C D E
1 3 5 7 9
> x[2,"E"]
 E
10


  • 행렬 다루기

#Benford법칙을 사용한 회계 감사 예제

앞자리수 실제값 기대값 입력
acctdata <- c(1, 132, 86.7,
2, 50, 50.7,
3, 32, 36.0,
4, 20, 27.9,
5, 19, 22.8,
6, 11, 19.3,
7, 10, 16.7,
8, 9, 14.7,
9, 5, 13.2)


  • 행렬로 만들기


acctdata <-matrix(acctdata,9,3, byrow = TRUE)
colnames(acctdata) <- c("digit", "actual", "expected")
acctdata
      digit actual expected
 [1,]     1    132     86.7
 [2,]     2     50     50.7
 [3,]     3     32     36.0
 [4,]     4     20     27.9
 [5,]     5     19     22.8
 [6,]     6     11     19.3
 [7,]     7     10     16.7
 [8,]     8      9     14.7
 [9,]     9      5     13.2

byrow = TRUE : 데이터를 채울 때 기본 옵션인 행 우선이 아니라 열에서 열로 데이터 채우도록 설정

카이제곱분포 개념 정리

R은 실제 카이제곱분포를 내장함수로 제공(아래는 연습의 의미)

chisquare <- sum((acctdata[,2]-acctdata[,3])^2/acctdata[,3])
chisquare
[1] 40.55482


  • 행렬 곱 연산


A<-matrix(c(6, 1,
 0, -3,
 -1, 2), 3, 2, byrow = TRUE)
B<-matrix(c(4, 2,
 0, 1,
 -5, -1), 3, 2, byrow = TRUE)
A
     [,1] [,2]
[1,]    6    1
[2,]    0   -3
[3,]   -1    2

B
     [,1] [,2]
[1,]    4    2
[2,]    0    1
[3,]   -5   -1

A+B
     [,1] [,2]
[1,]   10    3
[2,]    0   -2
[3,]   -6    1

A-B
     [,1] [,2]
[1,]    2   -1
[2,]    0   -4
[3,]    4    3

A*B (행렬곱 아님, 행렬의 각 요소끼리 곱함)
     [,1] [,2]
[1,]   24    2
[2,]    0   -3
[3,]    5   -2

t(A) (역행렬 아님, 요소의 반전임, 역행렬은 열과 행의 수가 동일한 경우에만 가능)
     [,1] [,2] [,3]
[1,]    6    0   -1
[2,]    1   -3    2

역행렬

※ 역행렬 : A,B모두 정방행렬이고, BA=I 를 만족할 때 B는 A의 역행렬이다.

A<-matrix(c(4,0,5,
0,1,-6,
3,0,4),3,3,byrow=TRUE)

B<-solve(A) #B는 A의 역행렬

> A %*% B  # 행렬곱
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1
> B %*% A
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1


  • 하나의 행 또는 열로 구성된 행렬


벡터는 하나의 행 또는 하나의 열로 구성된 행렬이 아님.
벡터의 경우 색인을 사용하면 그냥 해결됨.
그러나, 행렬로 하나의 행 또는 열을 사용한다면 drop = FALSE 설정을 하도록하자.
이유는 행렬에 관련된 몇 가지 연산이 벡터에서는 사용할 수 없기 때문.

> A
     [,1] [,2] [,3]
[1,]    4    0    5
[2,]    0    1   -6
[3,]    3    0    4
> A[,1]
[1] 4 0 3
> A[1,]
[1] 4 0 5
> A[1,,drop = FALSE]
     [,1] [,2] [,3]
[1,]    4    0    5
> A[,1,drop = FALSE]
     [,1]
[1,]    4
[2,]    0
[3,]    3

댓글

가장 많이 본 글