R 행렬 전처리 완벽 가이드: 생성·인덱싱·필터링 (2026 최신)

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 벡터를 행 방향으로 결합해 행렬을 만드는 구조
길이가 같은 벡터를 행 또는 열 방향으로 결합해 행렬을 만들 수 있습니다.

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


관련 글 보기