게임 제작 관련/개발환경(프로그램)

R 시작하기2 - Matrix(행렬), Dataframe만들기

김바보 2022. 10. 4. 20:16

Matrix는 row(행)과 column(열)로 이루어진 2차원 array이다.

row = 가로줄

column = 세로줄

 

[예습]

변수 = matrix(넣을 벡터, row줄 갯수, column줄 갯수)

변수 = data.frame(벡터1, 벡터2, stringsAsFactors = F)

 

 

 

 

1. Matrix 생성

y = matrix( c(1, 2, 3, 4), nrow = 2, ncol = 2)
------------------------
     [,1] [,2]
[1,]    1    3
[2,]    2    4

변수 = matrix(넣을 벡터, row줄 갯수, column줄 갯수)

nrow, ncol은 생략하고 그냥 숫자만 넣어도 된다.

 

c(1, 2, 3, 4)를 보면 세로방향으로 숫자가 먼저 채워진 것을 볼 수 있다.

y = matrix( c(1, 2, 3, 4), nrow = 2, ncol = 2, byrow = TRUE)
----------------
     [,1] [,2]
[1,]    1    2
[2,]    3    4

byrow = TRUE를 사용하면 가로방향으로 먼저 채울 수 있다.

 

 

 

 

 

2. Matrix 조작하기

y = matrix(c(1,3,4,5,1,3,4,1),4,2)
---------------------
     [,1] [,2]
[1,]    1    1
[2,]    3    3
[3,]    4    4
[4,]    5    1

이런식으로 매트릭스를 만들고

 

y[4, 1]
[1] 5

변수[row, col] 을 쓰면 해당 칸에 해당하는 숫자를 불러올 수 있다.

 

y[, 1]
[1] 1 3 4 5

, 1이면 col의 1번째를 지칭한다. 보면 1번째 열에 있던 숫자들이 다 불러와졌다.

반대로 [1,]라고 하면 row의 1번째가 불러와진다.

 

y[-2,]
-----------------------
     [,1] [,2]
[1,]    1    1
[2,]    4    4
[3,]    5    1

2번째 row에 음수(-)를 붙여서 원래 있던 2번째 row가 없어진 모습이다.

 

 

 

3. Matrix 합치기 - cbind, rbind

AA = rep(1,4)
[1] 1 1 1 1

BB = matrix( c(5:8, rep(-1,4), rep(0,4)), 4, 3)
     [,1] [,2] [,3]
[1,]    5   -1    0
[2,]    6   -1    0
[3,]    7   -1    0
[4,]    8   -1    0

cbind(AA, BB)
----------------
     AA       
[1,]  1 5 -1 0
[2,]  1 6 -1 0
[3,]  1 7 -1 0
[4,]  1 8 -1 0

AA는 rep써서 1차원 array 생성했고 BB는 matrix써서 row 4줄, col 3줄인 표를 뚝딱했다.

cbind = (n, x) n을 x에게 column방향으로 붙이기

결과를 보면 AA가 1번째 col에 들어가있는 것을 볼 수 있다.

 

BB = rbind(2, BB)
----------------
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    5   -1    0
[3,]    6   -1    0
[4,]    7   -1    0
[5,]    8   -1    0

기존 BB에 2 row를 rbind 시켰다.

rbind = (n, x) n을 x에게 row방향으로 붙이기

 

 

 

 

 

 

4. Dataframe

기본적으로 한 array는 타입(수치형, 문자형 등)이 같아야 한다. Matrix의 경우 2개의 array가 모두 같아야 한다.

그러나 Dataframe의 경우 column별로 다른 type의 데이터를 저장할 수 있다.

 -> Matrix와 Dataframe의 차이!

kids = c("Jack", "Jill")
ages = c(12, 10)
d = data.frame(kids, ages, stringsAsFactors = F) *stringsAsFactors = 일단 신경x
------------
  kids ages
1 Jack   12
2 Jill   10

변수 = data.frame(벡터1, 벡터2, stringsAsFactors = F)

넣은 벡터는 column 방향으로 차곡차곡 쌓인다.

1col엔 kids, 2col엔 ages가 있는 dataframe을 그려보았다. 각 컬럼에 다른 타입을 받아왔음을 볼 수 있다.

 

str(d)
----------
'data.frame':	2 obs. of  2 variables:
 $ kids: chr  "Jack" "Jill"
 $ ages: num  12 10
 
class(d)
[1] "data.frame"

typeof(d)
[1] "list"

str(d)를 확인해보면 kids는 chr(문자형), ages는 num(수치형)라고 나와있다.

 

 

 

 

 

4-1. Column명 바꾸기

Matrix에서는 변수[row, col]을 이용해 특정 원소나 행렬을 불러왔다.

d$kids
[1] "Jack" "Jill"

class(d$ages)
[1] "numeric"

dataframe에서는 변수$column명 으로 특정 원소나 행렬을 불러올 수 있다.

여기서 dataframe에서도 변수[row, col]로 불러올 수 있을까 의문이 들었는데, 결론은 된다!

 

d[1,]
-----------
  kids ages
1 Jack   12

d[1, "kids"]
-----------
[1] "Jack"

행만 불러오는 것, 1행1열의 값을 불러오는 것 모두 정상작동 됨을 볼 수 있다. 단 [ ] 안에 문자형을 넣기 위해선 " "가 들어가야 한다.

 

colnames(d) = c("이름", "나이")
rownames(d) = c("1번", "2번")
-----------------------------------
    이름 나이
1번 Jack   12
2번 Jill   10

col, row명을 바꾸려면 각각 colnames(변수), rownames(변수)를 해주자.

그냥 names(변수)도 해봤는데, column명이 바뀌었다. 이유는 모르겠음.

 

 

 

 

* dataframe에서 rbind가 안될때(Error in match.names)

A = data.frame(x1 = rep(0,10), x2 = rep('b',10))
B = data.frame(x3 = rep(1,10), x2 = rep('d',10))
-----------------------------------------------------
> A 				> B
   x1 x2				x3 	x2
1   0  b			1 	1	d
2   0  b			2 	1 	d
3   0  b			2 	1 	d
4   0  b			2 	1 	d
5   0  b			2 	1 	d
6   0  b			2 	1 	d
7   0  b			2 	1 	d
8   0  b			2 	1 	d
9   0  b			2 	1 	d
10  0  b			2 	1 	d

대충 요런 dataframe을 만들었다. 이 둘의 cbind는 정상작동하지만 rbind를 하면

 

Error in match.names(clabs, names(xi)) : 
  이전에 사용된 이름들과 일치하지 않습니다.

요런 오류가 뜬다.

rbind 하는 과정에서 x2 열이름은 같지만 x1, x3의 이름이 서로 달라 bind할 수 없기 때문이다.

 

A = data.frame(x3 = rep(0,10), x2 = rep('b',10))
----------------------------------------------------
   x3 x2
1   0  b
2   0  b
3   0  b
4   0  b
5   0  b
6   0  b
7   0  b
8   0  b
9   0  b
10  0  b
11  1  d
12  1  d
13  1  d
14  1  d
15  1  d
16  1  d
17  1  d
18  1  d
19  1  d
20  1  d

A나 B중 하나의 col명을 다른거랑 일치시켜주면 된다. x3에 잘 합쳐져서 나온 모습이다.