행렬과 배열
이번 게시글에서는 다차원 데이터 구조인 `행렬`과 `배열`에 대해 알아보겠습니다.
참고로 `행렬`과 `배열`도 벡터이기 때문에 벡터와 마찬가지로 원소들은 동일한 데이터 타입을 가집니다.
행렬
`행렬`은 말 그대로 `행(row)`과 `열(column)`으로 구성된 2차원의 데이터 구조입니다. 이는 뒤에서 다룰 배열의 한 형태입니다.
행렬 생성
`matrix()`를 이용하여 행렬을 생성할 수 있습니다. 코드를 통해 확인해보겠습니다.
위 결과를 확인해보면 2차원 구조로 행렬을 생성한 것을 볼 수 있는데요. 여기서 중요한 점은 행렬을 만들때 열 우선방식으로 생성된다는 점입니다.
행렬을 생성할 때 사용하는 주요 파라미터로는 `data`, `nrow`, `ncol`, `byrow` 등이 있는데요. 각 파라미터는 다음과 같습니다.
- `data`: 행렬의 데이터를 입력을 하는 부분으로 벡터를 입력합니다.
- `nrow`, `ncol`: 행과 열의 수를 지정합니다.
- `byrow` : 행렬을 행 우선 방식으로 생성합니다. (기본값 FALSE)
byrow=TRUE로 설정시 행기준으로 데이터를 넣는 것을 확인할 수 있습니다. 참고로 다른 언어와 마찬가지로 인자를 순서대로 주면 파라미터명을 생략해도 됩니다.
이 외에도 행렬 생성시 재밌는 사실에 대해 조금 다뤄볼게요.
데이터에 값을 넣으면 단일 값을 가지는 행렬을, 데이터에 값이 부족하면 자동으로 반복해서 행렬을 생성합니다.
data 부분을 생략하면 결측값(NA)으로 채워집니다.
행렬 연산
행렬 역시 선형 대수 연산(행렬 간 곱, 스칼라 행렬 곱 등)을 사용할 수 있는데요. 가장 기초적인 행렬 연산에 대해 알아보겠습니다.
1) 행렬 합, 곱
`+`, `-` 를 통해 행렬간 합과 차이를 구할 수 있습니다. 추가로 `%/%`를 통해 행렬간 나눗셈도 가능합니다.
`%*%`를 통해 행렬간 곱을 구할 수 있습니다.
2) 스칼라와 행렬 계산
스칼라와 행렬간 곱도 구할 수 있습니다.
그 외 행렬에 대한 자세한 수학적 연산 방법들은 다음 글을 참고해주세요.
행렬 데이터 접근하기
기본적으로 벡터의 인덱싱과 거의 동일한데요. 다만 차이점은 행과 열을 구분해야한다는 점입니다. 바로 예제들을 통해 알아보겠습니다.
[행, 열] 순으로 데이터를 가져올 수 있습니다. 위 코드 결과, 색인(벡터)를 이용하여 1행과 3행의 행렬을 가져왔는데요. 열부분에 아무것도 입력을 안하면 모든 열을 가져온다는 의미입니다.
주의할점은 `,`로 구분을 반드시 해야하는데요. `,`를 생략하면 예상치 못한 결과를 출력합니다.
벡터와 마찬가지로 `-`로 특정 원소를 제외할 수도 있습니다. 여기서 재밌는 사실은 단일 열 혹은 행만 남는 경우 벡터로 차원 축소가 일어난다는 점입니다.
이는 위 코드처럼 drop=FALSE 를 추가해주면 그대로 행렬을 유지합니다.
행렬 필터링
행렬 필터링도 벡터처럼 Boolean 형으로 가능합니다.
조금 까다로운 필터링 예제를 가져와봤는데요. 순서대로 이해를 해보겠습니다.
첫 번째 조건식은 첫번째 열에서 1보다 큰 행을 의미합니다. 마찬가지로 두 번째 조건식은 두 번째 열에서 4보다 큰 행을 의미합니다.
이를 `&` 연산을 통해 논리 연산을 진행합니다. 그 결과 2번째, 3번째 행이 TRUE로 반환됩니다. 따라서 최종 결과가 2 3 5 6으로 출력된 것을 확인할 수 있습니다.
&&는 스칼라 연산에 사용하고, &는 벡터간 연산에 사용합니다.
행렬 주요 함수
다음으로 행렬을 다루는데 유용한 함수들에 대해 알아보겠습니다.
행렬간 합치기
`rbind()`와 `cbind()`를 통해 행렬을 행/열 기준으로 합칠 수 있습니다. 예시는 다음과 같습니다.
행렬 정보 확인하기
아래 예제와 같이 데이터 타입, 행/열의 수, 차원 수 등을 확인할 수 있습니다.
apply()
R에서는 많은 apply() 계열 함수(apply, lapply, sapply...)들이 있는데요. `apply() 계열 함수`들은 기본적으로 벡터, 행렬 또는 데이터 프레임에 함수를 적용한 결과를 얻기 위해 사용합니다. 이번에는 `apply()` 사용법에 대해서만 알아보겠습니다.
`apply()`는 apply(x, dimcode, f, fargs)로 사용합니다.
- `x` : 행렬, 배열, 데이터 프레임
- `dimcode`: 1로 설정시 행 방향으로 적용, 2는 열 방향
- `f`: 적용할 함수
- `fargs`: 적용할 함수의 인자
- 반환값: 행렬, 배열, 데이터 프레임을 각각 벡터, 배열, 리스트로 반환
행, 열 이름짓기
벡터에서 `name()`으로 각 원소별로 이름을 지은 것과 비슷하게 행렬에서도 `colnames()` 과 `rownames()`을 통해 이름을 추가할 수 있습니다.
배열
`배열`은 2차원 이상으로 확장시킨 데이터 구조입니다. 위에서 언급한 것처럼 행렬도 배열의 2차원 형태인 것인데요. 배열은 필요에 따라 3차원, 4차원 등 임의의 차원을 생성할 수 있습니다.
배열의 생성
`array()`를 통해 배열을 생성할 수 있습니다.
`dim` 을 통해 배열의 차원을 지정할 수 있습니다.
dim 을 지정해줄때 (행, 열, 배열) 순으로 입력하면 됩니다.