앞서 벡터에 대해 다루고 이해했다면, 이번엔 매트릭스와 데이터 프레임에 대해 정리해 보겠다.
매트릭스는 우리말로 '행렬'이라는 뜻이다. 행과 열을 갖는 m*n형태의 사각형에 데이터를 나열한 데이터 구조이다.
직접 손으로 쓸때야 큰 괄호안에 숫자를 넣었지만 컴퓨터는 그렇지 않다.
기본적으로 열을 우선으로 채우며, 함수의 옵션을 통해 이를 수정하는 것이 가능하다.
대충 이정도만 알아도 이용하는 데 큰 문제 없으므로 바로 실습에 들어가보자.
※ 최종 수정(21-01-09)
1. Matrix의 생성
- 첫번째 인자는 넣을 값, 두번째 인자는 행 개수, 세번째 인자는 열개수, 네번째 인자는 행 또는 열 방향을 지정한다.
z <- matrix(1:20,nrow=4, ncol=5, byrow=T) #byrow가 T(True)이므로 행우선으로 값이 채워진다. # 아래 그림과 같이 출력된다. ![]() |
2. cbind, rbind 함수
- 이젠 함수 이름만 보고 유추해볼 수 있을 것 같다.
- 'c'로 시작하니까 column(열) 단위로 bind(묶다, 병합하다)하는 함수다. rbind역시 비슷하다.
- 사용 방법은 아래와 같다.
- 참고로, 굳이 rbind를 다루지 않는 이유는 행 우선으로 채운다는 것 외에 cbind랑 동일하기 때문이다.
x <- 1:4; y<-5:8 m1 <- cbind(x,y) #열단위로 병합된다. x가 기준이 된다. 1열에 1,2,3,4가 들어가고 2열에 5,6,7,8이 들어간다. m2 <- rbind(x,y) #행단위로 병합된다. 역시 x가 기준이 된다. 1행에 1,2,3,4가 들어가고 2행에 5,6,7,8이 들어간다. |
- 마치 뭐랄까, 너무 싱겁다. 원소개수가 같아서 문제가 없다. 테스트에 문제가 없다는 건 이상하다.
- 그래서 오히려 문제를 일으켜봤다. R studio의 반응이 궁금하다.
x <- 1:4; y <- 5:6 # x가 4개, y가 2개의 원소를 가지고 있다. m1 <- cbind(x,y) # x는 정상적으로 1열에 들어가는데, 문제는 2열에 있다. 2열에는 5,6,5,6이 들어간다. x<- 1:4; y <- 5:10 # x가 4개, y가 6개의 원소를 가지고 있다 m1 <- cbind(x,y) # 드디어 R studio가 오류를 뱉어냈다. # number of rows of result is not a multiple of vector length란다. # 즉, y의 개수가 x의 길이의 배수가 아니라는 오류다. |
- 문제를 일으킴으로서 2가지를 알았다.
- cbind,rbind 함수의 2번째 인자(벡터)는 반드시 첫째 인자(벡터)의 길이의 배수여야 한다는 것이다.
- 만약, 배수를 다 채우지 못한다면 두번째 인자를 복제하여 첫째인자의 길이만큼 집어 넣는다.
3. Matrix안의 원소 출력하기
- 이미 앞서 벡터를 다룰때 잠깐 맛봤었다.
- 거두절미하고 바로 예시부터 보자.
x <- 1:4, y <-5:8 m1 <- rbind(x,y) x[2,3] # 2행3열의 원소를 출력한다. 7이 출력된다. x[2,] # 2행의 모든 원소를 출력한다. '[1] 5,6,7,8'이 출력된다. [1]은 1행이라는 뜻이다. x[,2] # 2열의 모든 원소를 출력한다. 2,6이 출력된다. # 소소하게 출력의 차이점은 2,6위에 x,y가 출력된다는 것이다. x[-2,-3] # 이 방식은 이용 불가능 하다. 하나의 행 또는 하나의 열만 제거하여 출력 가능하다 x[-2,] # 2행만 빼고 출력한다 x[,-3] # 3열만 빼고 출력한다 |
4. rownames, colnames
- 각 행, 열에 이름을 붙여주는 함수다.
- 당연히 기존 입력된 matrix의 행/열과 입력되는 행/열의 이름 개수가 맞아야 정상적으로 입력될 것 같다.
- 그냥 하면 밋밋하니, 역시 문제를 일으켜본다.
x <- 1:4; y<-5:8 m1 <- rbind(x,y) rownames(m1) <- c("a","b","c","d","e") # 2행짜리에 이름이 5개니 당연히 오류날 것 같다. # not equal to array extend. array범위와 동일하지 않다는 오류다. # 왜 matrix가 아니라 array라고 나오는지는 모르겠다. rownames(m1) <- c("a") # 2행짜리에 이름을 1개만 넣었다. 역시 같은 오류가 출력된다. x["a",] # 참고로 이름을 넣고나면 이렇게 쓸 수 있다. 코드 읽기가 쉬워졌다. |
- 문제를 일으켜 본 결과, 그냥 이름은 길이에 맞게 넣어주자. 아님 아예 쓰지 않던가...
matrix까지는 역시나 직관적이어서 크게 어려운 부분은 없었다.
다음에는 Data Frame에 대해서 정리해 보겠다.
'데이터와 AI > R 기초' 카테고리의 다른 글
[R기초-6] R sudio를 통해 파일 읽고 쓰기 (0) | 2021.01.11 |
---|---|
[R기초-5] Matrix 및 Data Frame의 연산 및 함수 (0) | 2021.01.11 |
[R기초-4] Data Frame 생성 및 이용 (0) | 2021.01.08 |
[R기초-2] 벡터의 연산, 함수, 논리값 (0) | 2021.01.03 |
[R기초-1] 벡터의 정의와 함수 (2) | 2020.12.22 |