2026년 8월 업데이트: 이 글은 R 4.6.1을 기준으로 행렬 생성, 인덱싱, 필터링, 값 변경과 자주 발생하는 차원 축소 문제까지 정리합니다.
R 행렬은 같은 자료형의 값을 행과 열로 배치한 2차원 객체입니다. 데이터 전처리뿐 아니라 선형대수, 회귀분석, 이미지·거리 데이터 처리에서도 자주 사용됩니다. 기본 문법부터 실수하기 쉬운 부분까지 예제로 살펴보겠습니다.
R 행렬의 정확한 구조
R 행렬은 내부적으로 하나의 원자 벡터에 dim 속성을 붙인 객체입니다. 모든 원소가 같은 자료형이어야 하며, 숫자와 문자를 섞으면 더 포괄적인 자료형으로 강제 변환됩니다.
m <- matrix(1:6, nrow = 2)
m
dim(m)
typeof(m)
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# [1] 2 3
# [1] "integer"
dim(m)의 결과는 행 수와 열 수 순서입니다. 위 행렬은 2행 3열입니다. 데이터 프레임은 열마다 자료형이 달라도 되지만, 행렬은 전체가 하나의 자료형이라는 차이가 있습니다.

R 행렬 만들기
matrix() 기본 문법
matrix(data, nrow, ncol, byrow = FALSE, dimnames = NULL)
data: 행렬에 채울 값nrow,ncol: 행과 열의 개수byrow:FALSE면 열 방향,TRUE면 행 방향으로 채움dimnames: 행·열 이름
# 기본값: 열 방향으로 채우기
matrix(1:6, nrow = 2)
# 행 방향으로 채우기
matrix(1:6, nrow = 2, byrow = TRUE)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
matrix(nrow = 2, ncol = 2)처럼 데이터 없이 만들면 NA로 채워진 논리형 행렬이 생성됩니다. 숫자를 채울 예정이라면 matrix(NA_real_, 2, 2)처럼 원하는 자료형을 명시하는 편이 안전합니다.
cbind()와 rbind()
x <- 1:3
y <- 4:6
cbind(x, y) # 열로 결합
rbind(x, y) # 행으로 결합
결합할 벡터의 길이가 맞지 않으면 재활용 규칙이 적용되거나 경고가 발생할 수 있습니다. 의도하지 않은 반복을 피하려면 결합 전에 length()를 확인하세요.
행과 열 이름 붙이기
score <- matrix(
c(80, 90, 75, 88, 92, 84),
nrow = 3,
byrow = TRUE,
dimnames = list(
c("민지", "준호", "서연"),
c("중간", "기말")
)
)
score["민지", "기말"]
# [1] 90
R 행렬 인덱싱
행렬은 행렬[행, 열] 순서로 선택합니다. 빈 위치는 해당 차원의 전체를 뜻합니다.
x <- matrix(1:10 * 2, ncol = 2)
x[1, 2] # 1행 2열
x[, 2] # 두 번째 열 전체
x[3, ] # 세 번째 행 전체
x[c(2, 3, 5), 2] # 여러 행 선택
x[-1, ] # 첫 번째 행 제외
중요: drop = FALSE
행이나 열을 하나만 선택하면 R은 기본적으로 결과를 벡터로 단순화합니다. 이후 코드가 행렬을 기대한다면 오류 원인이 됩니다.
x[, 1] # 벡터
x[, 1, drop = FALSE] # 5×1 행렬 유지
x[1, , drop = FALSE] # 1×2 행렬 유지
함수나 반복문 안에서 선택 결과의 길이가 달라질 수 있다면 방어적으로 drop = FALSE를 사용하는 것이 좋습니다.
조건으로 필터링하고 값 바꾸기
# 두 번째 열이 15보다 큰 행만 선택
x[x[, 2] > 15, , drop = FALSE]
# 10보다 큰 모든 원소를 NA로 변경
x[x > 10] <- NA
# 결측치 위치 확인
which(is.na(x), arr.ind = TRUE)
행 조건으로 필터링할 때는 조건 벡터의 길이가 행 수와 같아야 합니다. 원소 단위 논리 인덱싱은 행렬 전체를 열 우선 순서로 다루므로, 행을 남기려는 작업과 구분해야 합니다.
자주 쓰는 행렬 연산
a <- matrix(1:4, nrow = 2)
b <- matrix(5:8, nrow = 2)
a + b # 원소별 덧셈
a * b # 원소별 곱셈
a %*% b # 행렬곱
t(a) # 전치행렬
rowSums(a) # 행별 합
colMeans(a) # 열별 평균
*와 %*%는 전혀 다른 연산입니다. 행렬곱에서는 앞 행렬의 열 수와 뒤 행렬의 행 수가 같아야 합니다.
자료형 변환 주의
mixed <- matrix(c(1, 2, "3", "4"), nrow = 2)
typeof(mixed)
# [1] "character"
numeric_matrix <- matrix(as.numeric(mixed), nrow = 2)
문자 하나가 섞이면 숫자도 문자로 변환됩니다. CSV나 엑셀에서 가져온 데이터를 as.matrix()로 바꿀 때 문자 열이 포함되어 있는지 먼저 확인하세요.
핵심 정리
- 행렬은 동일한 자료형을 가진 2차원 원자 객체입니다.
matrix(),cbind(),rbind()로 생성합니다.- 인덱싱 순서는
[행, 열]입니다. - 차원을 유지하려면
drop = FALSE를 사용합니다. - 행렬곱은
%*%, 원소별 곱은*입니다.
공식 참고 자료: An Introduction to R, R 행렬·배열 인덱싱 문서
최종 업데이트: 2026년 8월 24일
본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!
당신이 좋아할 만한 콘텐츠
by Google Adsense