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

댓글
댓글 쓰기