안녕하세요! 몇일 쉬고 행렬구조에 대해서 쓰게되네요.
저번까지는 R에 대해서 간단한 연산연습을 해봤는데요~
오늘은 행렬(Matrix)을 가지고 몇 가지 함수를 써보고자 합니다.
자 우선, 행렬을 임의로 만들어봐야겠죠~
a<-c(1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31)
a
[1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
#일단 임의의 변수 a에 1부터 31까지 (4X4행렬을 만들기 위해서) 홀수만 모아서 넣어봤습니다.
이 숫자들로 이제 4X4행렬을 만들어 보겠습니다.
# matrix(벡터 혹은 숫자, 행 수 , 열 수)
am<-matrix(a,4,4)
am
[,1] [,2] [,3] [,4]
[1,] 1 9 17 25
[2,] 3 11 19 27
[3,] 5 13 21 29
[4,] 7 15 23 31
#am이라는 (제 마음대로 a의 matrix라는 뜻으로 명명했음) 변수로 명하고, matrix()함수를 이용해서,
4행 4열 매트릭스를 만드는 명령어를 쓰면 위와같이 4X4행렬이 만들어집니다.
여기서 보시면 아시다시피, 열 먼저 채워지는 특성이 있다는 것을 알 수 있죠?
dim(am)
[1] 4 4
diag(am)
[1] 1 11 21 31
#dim함수를 사용하면, dim() 괄호 안의 행렬구조데이터에 대해서 행과 열을 반환해줍니다. 즉 4행 4열이라고 말해주고 있죠.
dimention의 뜻입니다.
#diag() 함수는 행렬의 대각선 값들만 가져옵니다. 보시다시피 1, 11, 21, 31 이 출력되었죠.
t(am)
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 9 11 13 15
[3,] 17 19 21 23
[4,] 25 27 29 31
# t()함수는 행렬구조를 transform해줍니다. 즉 열을 행으로 바꾸고 행을 열로 바꾸죠. 즉 뒤집기라고 보시면 됩니다.
1,3,5,7 이 1열에 있었는데 1 행으로 간 것을 볼 수 있습니다.
am%*%t(am)
[,1] [,2] [,3] [,4]
[1,] 996 1100 1204 1308
[2,] 1100 1220 1340 1460
[3,] 1204 1340 1476 1612
[4,] 1308 1460 1612 1764
# 행렬구조의 곱셉연산은 %*%표시로 하는데요, 위의 am과 t(am) 행렬의 곱셉을 한 것입니다.
colnames(am)<-c("A","B","C","D")
rownames(am)<-c("E","F","G","H")
am
A B C D
E 1 9 17 25
F 3 11 19 27
G 5 13 21 29
H 7 15 23 31
# 이제 1,2,3,4,에 각각 이름을 붙여본 것인데요, 그냥 colnames(), rownames()를 쓰면 열과 행이름을 조회할 수 있습니다.
거기다가 제가 임의로 이름을 붙여넣어 준 것입니다.
여기까지는 쉽게 따라올 수 있었을 것이라고 생각됩니다. 바로 다음으로 넘어가서, 행렬구조에서의 원소선택과 대체를 해보겠습니다.
# 행렬 구조에서의 원소 선택
am
A B C D
E 1 9 17 25
F 3 11 19 27
G 5 13 21 29
H 7 15 23 31
# 앞서 만들었던 am행렬을 가지고 해보겠습니다. 행렬 구조의 선택은 행렬구조[행,열] 로서 원소선택을 할 수 있는데요,
am[1,3] 이라면 am행렬구조에서 1행 3열에 해당하는 값을 출력해줍니다.
am[1,3]
[1] 17
am[3,2]
[1] 13
am[1,]
A B C D
1 9 17 25
am[,1]
E F G H
1 3 5 7
# am행렬구조에서 1행 3열 데이터값을 불러옴 am[1,3]
# am행렬구조에서 3행 2열 데이터값을 불러옴 am[3,2]
# am행렬구조의 1행 전체를 불러옴 am[1,]
# am행렬구조의 1열 전체를 불러옴 am[,1]
1행과 1열 전체를 불러올 때에는 반대편 칸을 콤마찍고 비워두시면 됩니다.
am[c(1,3),c(2)]
E G
9 13
am[c(1,3),c(2)]<-5
am
A B C D
E 1 5 17 25
F 3 11 19 27
G 5 5 21 29
H 7 15 23 31
# 위의 콤바인 함수를 쓴 것은 어떤 것을 의미할까요? 왼쪽은 행, 오른족은 열을 나타냈습니다. 따라서 1행 3행의 2열 값을 불러옵니다.
즉 1행 2열, 3행 2열값이 되는거지요. 그것을 5라는 수로 임의로 대체도 해보겠습니다.
(am+10)
A B C D
E 11 15 27 35
F 13 21 29 37
G 15 15 31 39
H 17 25 33 41
#행렬 구조 전체의 연산은 그 행렬에다가 덧셈 곱셈등을 해주시면 됩니다.
그러면 이제, 행렬구조 만들기, 행렬구조 속의 원소선택과 대체를 해봤는데요,
이번엔 행렬구조의 병합방법들 중 data.frame에 대해 보겠습니다.
# 2016년도 브라질 리우올림픽 축구 예상 순위 (내맘대로)
rank<-c(1,2,3,4,5,6,7,8)
riosoccteam<-c("KOR","BRA","GER","USA","ENG","ARG","JAP","NKOR")
riorank<-data.frame(rank,riosoccteam)
riorank
rank riosoccteam
1 1 KOR
2 2 BRA
3 3 GER
4 4 USA
5 5 ENG
6 6 ARG
7 7 JAP
8 8 NKOR
# 이제 곧 브라질 리우 올림픽이 개막되죠? 그래서 저희 올림픽 축구 예상 순위를 제 맘대로 해봤습니다.
# rank라는 임의의 변수를 잡고 1위부터 8위까지 만들기 위해 1~8을 넣어줬구요.
# riosoccteam라는 변수는 리우축구팀이라는 곳에 한국을 1등으로 하기위해 첫번째로 넣었고, 북한을 꼴찌로 넣었습니다.
# 그리하여 riorank라는 변수를 data.frame()함수를 이용해서 rank변수와 riosoccteam변수 두 개를 합했습니다.
# 그 결과, 랭크 변수가 1열에 쭉 나열되고, riosoccteam이 2열에 쭉 나열된 것을 볼 수 있습니다.
# 한국이 1등이죠~??
# 원소 선택
riorank[1,2]
[1] KOR
Levels: ARG BRA ENG GER JAP KOR NKOR USA
riorank[,2]
[1] KOR BRA GER USA ENG ARG JAP NKOR
Levels: ARG BRA ENG GER JAP KOR NKOR USA
str(riorank)
'data.frame': 8 obs. of 2 variables:
$ rank : num 1 2 3 4 5 6 7 8
$ riosoccteam: Factor w/ 8 levels "ARG","BRA","ENG",..: 6 2 4 8 3 1 5 7
# 앞서 원소선택에서 자주 했듯이, 1행 2열 즉 1위를 보고싶을 때 riorank[1,2]을 썼구요.
# riorank[,2]는 제가 설정한 참가국을 보기 위해서 쓴 명령어입니다.
# str()함수는 structure 함수입니다. 즉 구조를 보는 함수입니다. 이부분은 중요한데요. 자주 쓸 함수입니다.
(나중에든 지금이든)
# str()함수는 어떤 데이터프레임형태의 구조를 보기에 적합한 함수입니다.
# 보면, 8obs. of 2 variables : 라는 뜻은 2개의 변수가 있고(rank, riosoccteam), 총 8개의 관측치가 있다는 것입니다.
# rank 함수는 num 즉 뉴메릭 형태라는 것을 알려주죠.
# riosoccteam은 Factor 즉 요인으로 전체 8 levels ( 8개의 단위)가 있다는 것을 알려주고, 6 2 4 8 3 1 5 7은
# 배정된 숫자를 나타냅니다. 아르헨티나는(ARG)는 6위에 있었죠?
오늘은 R 내에서 임의의 행렬구조를 만들어 봤고, 그것을 transform 해보기도 하고, 연산도 해보고, 병합도 해봤는데요!
많은 내용인것 같지만 쉬운 부분이고 1장 분량도 안됩니다 ㅠㅠ
다음에는 제가 임의로 만든 데이터가 아니라 실제 R 패키지에 있는 airquality 데이터를 가지고 해보겠습니다.
'## 오래된 게시글 (미관리) ## > R' 카테고리의 다른 글
+ R명령어 조금 더 알아보기 (0) | 2018.11.20 |
---|---|
7. airquality 데이터를 이용한 데이터변환 (0) | 2018.11.20 |
5. R 연산 연습 (0) | 2018.11.20 |
4. R Programming 기초 (0) | 2018.11.20 |
3. 분석 마스터 플랜 (0) | 2018.11.20 |