티스토리 뷰

1. Matrices 란

사전에 검색을 해보면 행렬이라는 뜻. 테이블을 보여주는 방법이며 R은 테이블을 보여주는 방법 중 하나라고 보면 된다.

나중에 다룰 data frame을 위한 stepping stone이기도 하다고 한다.

 

data는 table format으로 나타내는데, R에서는 matrix로 저장한다. 

Vector가 일차원적인(one-dimension)이였다면 matrix는 이차원적인(two-dimension)이라고 보면되고, vector는 한 column이라면, matrix는 column과 row로 이루어져 있다고 보면 된다.

matrix를 표현할때에는 위와 같이 row은 [num, ] 형태로, column는 [ ,num]형태로 표기한다.

A[row, column]로 표기할 수 있다. 

또한 R에서 matrix는 vector와 마찬가지로 같은 type의 element만 가질 수 있다.

 

2. Matrices를 만드는 법

(1) matrix() 함수 이용

?matrix를 통해 사용법을 확인해보면 matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)인것을 확인 할 수 있다. data에 vector를 넣어주고, column수와 row수를 정해주면 

my.data <- 1:20
A <- matrix(my.data, 4, 5) 
A

위와같이 1~20의 수가 column을 따라 입력되게 되는데, 이는 byrow=F로 default 값이 설정되어 있기 때문이다.

byrow=T로 아래와 같이 설정해 준다면,

B <- matrix(my.data, 4, 5, byrow = T) 
B

위와같이 row를 따라 입력되게 된다. 이 방법은 잘 사용하진 않지만 어떻게 작동하는지는 알 필요가 있다고 한다.

 

(2) rbind()와 cbind()

 : vector를 matrix로 row by row로 bind해주는것이 rbind(), column by column으로 bind 해주는것이 cbind()이다.

* 코드예시)

# rbind()와 cbind()차이
r1 <- c("I", "am", "happy")
r2 <- c("What", "a", "day")
r3 <- c(1,2,3)
C <- rbind(r1, r2, r3)
D <- cbind(r1, r2, r3)

# cbind
c1 <- 1:5
c2 <- -1:-5
D <- cbind(c1,c2)
D

* C와 D의 결과)

 

vector를 row로(가로) 연결하는것이 rbind(), column으로(세로) 연결하는 것이 cbind()이다.

이때 주의할 점은 반드시 vector의 length가 같아야 한다. 

 

3. Naming Dimension

(1) Vector naming

이 개념은 다른 언어에는 잘 없기 때문에 생소할 수 도 있다.

names()라는 함수를 통해서 vector의 이름을 출력할 수 있고, (vector 형식으로) names()를 통해서 vector를 넣어줌으로서 vector 또한 배치 할 수 있다. name은 하나의 vector에 항상 동반하는 vector라고 보면 된다.

아래 예시에서 볼 수 있듯, index의 이름을 부여 하면, vector의 요소를 출력하거나 지정할 때, index 숫자(0부터 시작)대신 지정한 이름을 사용할 수 있다.

 

(2) Matrix naming

vector와 마찬가지로 rownames()와 colnames()를 통해서 index이름을 출력하고 지정할 수 있다.

마찬가지로 index 숫자 대신 지정한 이름을 사용하여 matrix의 column이나 row 또는 한개의 data를 지정할 수 있다.

 

name을 삭제하는 방법은 아래 코드를 참고 하면 된다.

* 코드예시)

# Named Vectors

Charlie <- 1:5
Charlie

# give names
names(Charlie)
# NULL은 이름이 없는 상태.

# 이름을 생성하는 방법
names(Charlie) <- c("a", "b", "c", "d", "e")
# assigning vectors to a function. 

Charlie
# -> named vector가 됨.
Charlie["d"]
names(Charlie)

# clear names
names(Charlie) <- NULL
Charlie

# -----------

# Naming Matrix Dimensions 1
# temp.vec <- rep(c("a", "B","zZ"), times=3)
temp.vec <- rep(c("a", "B","zZ"), each=3)
temp.vec

Bravo <- matrix(temp.vec, 3, 3)
Bravo

rownames(Bravo) <- c("How", "are", "you?")
Bravo

colnames(Bravo) <- c("X", "Y", "Z")
Bravo

Bravo[2,2]
Bravo["are", "Y"] <- 0
Bravo

# Row name 제거
rownames(Bravo) <- NULL

4. Matrix operation

(1) Matrix의 연산

vector의 연산과 마찬가지로, 첫째로 loop을 돌면서 다른 programming language 처럼 연산을 할 수 있다. (matix이기 때문에 double loop를 돌아야 할 것이다.)

둘째로는 vector의 연산처럼 자동으로 계산해 준다. 단, matrix와 matrix를 연산할 때, matrix의 size는 서로 같아야 한다.

이름은 어떻게 되나 테스트를 해보니, 이름이 없는 matrix와 이름이 있는 matrix에 대한 연산의 결과값으로는 이름이 있는 matrix가 나온다. 또한, matrix의 이름이 서로 다를경우에는 연산에 있어서 먼저 오는 matrix의 name을 따라 가는것 같다.

#matplot function

matplot(t(FieldGoals), type = "b", pch = 15:18, col=c(1:4,6))
# type의 종류에는 p, l, b, c, o, s, S, h, n 이 있다.
legend("bottomleft", inset=0.01, legend=Players, col=c(1:4,6), pch =15:18, horiz = F)


# transpose table
t(FieldGoals/Games)
colnames(t(FieldGoals))

matplot(t(FieldGoals/FieldGoalAttempts), type="b", pch=15:18)

 legend와 matplot는 함수가 달라서 color를 다르게 설정하면 구별이 안된다. (지정하는 색깔을 같게 맞춰줘 야함)
 따라서 다른 data를 가리킬수 있기 때문이다. 그래서 잘 안쓴다. 

t() :  transpose table. row와 column의 위치를 바꾸어 줄 수 있다.

 

(2) Matrix의 subsetting

* 코드예시)

x <- c("a", "b", "c", "d", "e")
x
x[c(1,5)]
x[1]

# matrices에서 비슷한 개념
Games
# top 3 player의 past 5 year를 보고 싶을때
Games[1:3,6:10]
# 두 player만 보고 싶을때
Games[c(1,10),]
# 2008, 2009년만 보고 싶을때
Games[,c("2008","2009")]
#첫 row만 뽑고싶을때

Games[1,]
is.matrix(Games[1,])
is.vector(Games[1,])

vector의 subset을 구하기 위해선(일부분만을 보기 위해선) index 숫자나 names()를 통해 지정해준 이름을 통해 전체 vector에서 부분만 볼 수 있었다.

matrix에서도 vector의 subset과 동일한 방식으로 적용이 되는데 문제는 위의 Games matrix에서 Games[1,]을 출력하면 vecor가 출력이될까 matrix가 출력이 될까.

답은 vector가 출력이 된다. 

이유는 R은 일반적인 프로그래밍 언어가 아닌 통계학과 수학을 주로 다루는 언어이기 때문에, 일반적인 programming 언어의 strict rule과 빠르고 민첩한 분석간의 trade-off가 있다.

R이 내가 원하는 것이 무엇인지를 파악해서 자동으로 matrix, vector를 각각 반환하는 것이다.

 

그럼 위 matrix에서 Games[1,]를 matrix로 출력하기 위해서는 어떻게 해야 하는가?

default로 [](square bracket)에는 drop이라는 다른 parameter가 있다.

drop은 default값이 TRUE로 설정되어 있는데, 세번째 parameter로 drop=F로 설정해주면 matrix로 바꿔준다.

원래 가지고 있던 object와 같은 class를 return해주는 기능이다.

[]를 사용할때, R은 내가 무엇을 원하는지 항상 추측하여 vector를 출력하는것 같으면 matrix에서 vector를 반환하기 때문에, R이 guess하는 것을 막고 싶으면 drop=F로 설정하면 된다.

 

5. 함수 function을 만드는 법

myplot <- function(data, rows=1:10){
  Data <- data[rows,,drop=F]
  matplot(t(Data), type = "b", pch = 15:18, col=c(1:4,6))
  legend("bottomleft", inset=0.01, legend=Players[rows], col=c(1:4,6), pch =15:18, horiz = F)
}
# parameter를 만드는 법 : function()안의 단어를 자동으로 찾는다.

myplot(Games)

# default parameter를 설정하는 법 : function()안에를 설정해주면 된다.

myplot(MinutesPlayed/Games,3)

matplot을 이용해 차트를 만들기 위해서는 matplot의 안 속성들을 사용할때 마다 모두 복사해서 사용해야 한다. 이 코드들을 simple form으로 만들어 모든 code를 치거나 복사하지 않기위해서 function을 사용한다.

parameter는 function()의 괄호안 단어를 자동으로 찾으며, default parameter를 설정하는 방법은 function() 안에 설정해 주면된다.

 

'Programming > R programming' 카테고리의 다른 글

R programming (2) - Fundamentals of R  (0) 2021.07.08
R programming (1) - Core principles  (0) 2021.07.08
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday