R 시작하기2 - Matrix(행렬), Dataframe만들기
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에 잘 합쳐져서 나온 모습이다.