R 데이터 구조는 모양보다 “서로 다른 자료형을 함께 담을 수 있는가”와 “행과 열을 가지는가”로 구분하면 수월합니다. 이 두 질문으로 벡터, 리스트, 행렬, 데이터프레임의 기본 차이를 판단할 수 있습니다.
한 종류의 값을 일렬로 다루면 벡터, 서로 다른 객체를 묶으면 리스트, 같은 자료형의 2차원 표는 행렬, 열마다 자료형이 달라도 되는 표는 데이터프레임입니다.

두 질문으로 먼저 좁힙니다
행과 열이 꼭 필요한지 먼저 봅니다. 필요 없다면 벡터와 리스트 중에서 고르고, 필요하다면 행렬과 데이터프레임 중에서 고릅니다. 그다음 모든 값이 같은 자료형이어야 하는지 판단합니다.
- 1차원이며 같은 자료형이면 벡터
- 1차원 묶음이지만 요소의 종류와 길이가 다르면 리스트
- 2차원이며 모든 셀이 같은 자료형이면 행렬
- 2차원이며 열마다 자료형이 다르면 데이터프레임
이 기준은 객체의 겉모양이 아니라 연산 방식과 선택 결과를 예측하는 데 쓰입니다. 화면에서 표처럼 보여도 행렬인지 데이터프레임인지에 따라 한 열을 꺼냈을 때의 결과가 달라질 수 있습니다.
벡터: R 연산의 기본 단위
scores <- c(82, 91, 76)
scores[scores >= 80]
벡터는 모든 원소가 같은 자료형을 가집니다. 숫자와 문자를 섞으면 R이 공통 자료형으로 변환하므로 의도하지 않은 결과가 생길 수 있습니다.
mixed <- c(1, TRUE, "3")
str(mixed)
이 경우 숫자와 논리값까지 문자형으로 변환됩니다. 계산할 벡터에 문자 하나가 섞였는데 평균이 구해지지 않는다면 값을 다시 입력하기 전에 str()로 자동 변환 여부를 확인합니다.
리스트: 서로 다른 객체를 한데 묶기
student <- list(
name = "민지",
score = c(82, 91, 76),
passed = TRUE
)
리스트는 문자, 숫자 벡터, 논리값뿐 아니라 다른 리스트나 데이터프레임도 담을 수 있습니다. 요소는 student$name 또는 student[[1]]처럼 꺼냅니다.
행렬: 같은 자료형의 행과 열
m <- matrix(1:6, nrow = 2)
m[1, 2]
행렬은 행과 열이 있지만 전체 원소가 같은 자료형입니다. 수치 계산에는 적합하지만 이름·점수처럼 자료형이 다른 열을 표로 관리하기에는 불편합니다.
데이터프레임: 분석용 표의 기본
df <- data.frame(
name = c("민지", "현우", "서연"),
score = c(82, 91, 76),
passed = c(TRUE, TRUE, FALSE)
)

데이터프레임은 열마다 자료형을 다르게 둘 수 있으며 모든 열의 길이는 같아야 합니다. CSV나 엑셀을 불러오면 대체로 이와 비슷한 표 구조로 다루게 됩니다.
데이터프레임은 내부적으로 길이가 같은 벡터들을 묶은 리스트 성격도 가집니다. 그래서 df$name, df[["name"]], df["name"]이 모두 열을 가리키지만 반환하는 구조는 같지 않습니다.
대괄호에 따라 반환 구조가 달라집니다
df["score"]
df[["score"]]
df$score
첫 줄은 열이 하나인 데이터프레임을 유지하고, 둘째와 셋째 줄은 점수 벡터를 꺼냅니다. 이후 함수가 표를 요구하는지 벡터를 요구하는지에 따라 알맞은 방식을 선택해야 합니다.
행렬에서도 한 행이나 한 열만 선택하면 기본 설정상 벡터로 단순화될 수 있습니다. 2차원 구조를 유지해야 한다면 m[1, , drop = FALSE]처럼 drop = FALSE를 사용합니다.
상황별 선택 기준
- 같은 종류의 여러 값이면 벡터를 사용합니다.
- 길이와 종류가 다른 객체 묶음이면 리스트를 사용합니다.
- 같은 자료형의 수치 표라면 행렬을 고려합니다.
- 관측값과 변수를 가진 분석 표라면 데이터프레임을 사용합니다.
구조가 헷갈릴 때 확인할 함수
class()는 대표 클래스를, typeof()은 내부 저장 방식을, str()은 전체 구조를 요약합니다. 초보 단계에서는 객체를 만든 직후 str()을 실행하는 습관이 가장 실용적입니다.
class(df)
typeof(df)
str(df)
dim()은 행과 열의 수를, length()는 객체 유형에 따른 길이를 보여 줍니다. 데이터프레임의 length(df)는 행 수가 아니라 열 수이므로 행 수가 필요할 때는 nrow(df)를 사용합니다.
변환하기 전에 손실을 확인합니다
구조를 바꿀 때는 모양만 맞는지 보지 말고 이름과 자료형이 유지되는지도 확인합니다. 데이터프레임을 행렬로 바꿀 때 문자 열이 하나라도 있으면 전체 행렬이 문자형이 될 수 있습니다.
mixed_matrix <- as.matrix(df)
str(mixed_matrix)
변환 직후 str(), dim(), head()를 차례로 실행하면 자료형과 크기가 어떻게 바뀌었는지 확인하고 첫 행도 살펴볼 수 있습니다.
구조를 직접 바꿔보려면 R 기초 데이터 타입 가이드의 변환 예제를 현재 객체에 적용해 볼 수 있습니다.
'R' 카테고리의 다른 글
| R 데이터 분석 패키지 입문: tidyverse부터 무엇을 설치할까 (0) | 2026.09.12 |
|---|---|
| R 조건문 반복문 기초: if·for·while을 고르는 기준 (0) | 2026.09.11 |
| R Positron 설치와 실행: 처음 시작하는 환경 설정 체크리스트 (0) | 2026.09.09 |
| R 데이터 분석 입문: 처음 4주에 배울 R 프로그래밍 순서 (0) | 2026.09.07 |
| R에서 데이터프레임에 tibble 열별, 행별 총합 붙이기 (0) | 2023.04.19 |
댓글