본문 바로가기
## 오래된 게시글 (미관리) ##/R

6. R 행렬구조

by #Glacier 2018. 11. 20.

안녕하세요! 몇일 쉬고 행렬구조에 대해서 쓰게되네요.

저번까지는 R에 대해서 간단한 연산연습을 해봤는데요~

오늘은 행렬(Matrix)을 가지고 몇 가지 함수를 써보고자 합니다.

자 우선, 행렬을 임의로 만들어봐야겠죠~




a<-c(1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31)

 [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