모던지 / 데이터분석 준전문가 / 데이터분석 1강. R의 자료 구조

데이터분석 1강. R의 자료 구조

R에서 벡터는 한 가지 타입만 담습니다. 이 규칙 하나를 모르면 숫자가 어느새 글자로 바뀌어 있는 이유를 영영 모릅니다.

풀고 시작

문제 1. R에서 x <- c(1, "a", TRUE)라고 입력한 뒤 x를 출력하면 어떻게 됩니까?
벡터는 한 가지 타입만 담을 수 있어 섞어 넣으면 가장 넓은 타입인 문자로 모두 바뀝니다. 논리값과 숫자만 섞였다면 숫자로 바뀌어 TRUE가 1이 되지만, 문자가 하나라도 끼면 전부 문자가 됩니다.

R은 어디서 왔나

R은 1990년대 초 뉴질랜드 오클랜드 대학의 로스 이하카와 로버트 젠틀먼이 만든 통계 언어입니다. 두 사람 이름의 첫 글자가 모두 R이라 이름이 R이 되었다는 이야기가 유명하죠. R은 벨 연구소에서 만든 통계 언어 S를 본떠 만들었고, 누구나 무료로 쓰고 고칠 수 있는 오픈소스로 공개되었습니다. 전 세계 사람들이 만든 추가 기능, 곧 패키지를 CRAN이라는 저장소에서 내려받아 쓸 수 있다는 점이 R을 통계 분석의 표준 도구로 만들었습니다.

파이썬에 익숙한 분이 R에서 가장 먼저 부딪히는 차이는 순번이 1부터 시작한다는 것입니다. 첫 번째 원소는 x[1]이고, 값을 넣을 때는 흔히 화살표 모양의 <-를 씁니다.

벡터: 모든 것의 기본

R에서 가장 작은 단위는 벡터(vector)입니다. 숫자 하나도 사실은 길이가 1인 벡터죠. 여러 값을 묶을 때는 c()를 씁니다.

x <- c(3, 1, 4, 1, 5)
length(x)   # 5
class(x)    # "numeric"

벡터의 가장 중요한 규칙은 한 벡터에는 한 가지 타입만 들어간다는 것입니다. 타입이 다른 값을 섞어 넣으면 R은 오류를 내는 대신 모두를 하나의 타입으로 강제로 바꿉니다. 바뀌는 방향은 정해져 있습니다. 논리값보다 숫자가 넓고, 숫자보다 문자가 넓어서, 더 넓은 쪽으로 맞춰집니다.

섞은 값 결과 이유
c(1, TRUE, FALSE) 1 1 0 논리값이 숫자로 바뀝니다
c(1, "a") "1" "a" 숫자가 문자로 바뀝니다
c(TRUE, "a") "TRUE" "a" 논리값이 문자로 바뀝니다

벡터끼리의 계산은 원소마다 일어납니다. 반복문을 쓰지 않아도 벡터 전체에 한 번에 연산이 걸리죠. 길이가 다른 두 벡터를 계산하면 짧은 쪽을 되풀이해 길이를 맞춥니다. 이것을 재사용 규칙(recycling)이라고 합니다.

c(1, 2, 3, 4) + c(10, 20)   # 11 22 13 24
c(1, 2, 3) + c(10, 20)      # 11 22 13 과 함께 경고

두 번째 줄은 결과가 나오기는 하지만, 긴 쪽의 길이가 짧은 쪽의 배수가 아니라서 R이 경고를 띄웁니다. 결과가 나왔다고 안심하면 안 되는 대목이죠.

행렬과 배열

벡터에 가로와 세로의 모양을 입히면 행렬(matrix)이 됩니다. 행렬도 벡터처럼 한 가지 타입만 담습니다. 조심할 점은 값을 채우는 방향입니다. R은 기본적으로 열 방향, 곧 위에서 아래로 먼저 채웁니다.

matrix(1:6, nrow = 2)
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6

matrix(1:6, nrow = 2, byrow = TRUE)   # 행 방향으로 채우면 1 2 3 / 4 5 6

행렬이 가로와 세로 두 방향이라면, 세 방향 이상으로 쌓은 것은 배열(array)이라고 부릅니다.

리스트와 데이터프레임

벡터와 행렬이 한 가지 타입만 담는다면, 리스트(list)는 무엇이든 담습니다. 숫자 벡터, 문자, 다른 리스트까지 한 상자에 넣을 수 있죠. 원소에 이름을 붙여 두면 $ 뒤에 이름을 적어 꺼냅니다. 대괄호를 한 겹으로 쓰면 원소를 담은 작은 리스트가 나오고, 두 겹으로 겹쳐 쓰면 그 안의 원소 자체가 나온다는 차이도 기억해 두면 좋습니다.

p <- list(name = "지수", scores = c(90, 85), passed = TRUE)
p$scores   # 90 85

분석에서 가장 많이 쓰는 것은 데이터프레임(data frame)입니다. 겉보기에는 표이지만 속은 길이가 같은 벡터들을 열로 묶은 리스트입니다. 그래서 열마다 타입이 달라도 되지만, 한 열 안에서는 타입이 하나로 통일됩니다. 이름은 문자, 점수는 숫자인 표가 가능한 이유가 이것입니다.

df <- data.frame(name = c("지수", "유진"), score = c(90, 85))
str(df)    # 열 이름과 타입을 한눈에 보여 줍니다
df$score   # 90 85
dim(df)    # 2 2

요인: 범주를 담는 그릇

"낮음, 보통, 높음"처럼 정해진 범주 가운데 하나를 가지는 값은 요인(factor)으로 담습니다. 요인은 겉으로는 글자처럼 보이지만, 안에는 가능한 범주의 목록인 수준(levels)을 따로 들고 있습니다. 수준은 따로 정하지 않으면 가나다순이나 알파벳순으로 정렬됩니다. 3과목에서 분류 모델의 목표 변수를 다룰 때 요인이 자주 나오니 모양을 눈에 익혀 두세요. 다음 강에서는 이렇게 담은 데이터를 골라내고 계산하는 방법을 봅니다.

인출 문제

문제 1. R에서 c(1, 2, 3, 4) + c(10, 20)을 계산한 결과는 무엇입니까?
짧은 벡터 c(10, 20)이 되풀이되어 10, 20, 10, 20으로 맞춰진 뒤 원소마다 더해집니다. 긴 쪽의 길이 4가 짧은 쪽 2의 배수라 경고도 없이 계산됩니다.
문제 2. R에서 matrix(1:6, nrow = 2)로 만든 행렬의 첫째 행은 무엇입니까?
R은 기본적으로 열 방향으로 값을 채우므로 1과 2가 첫째 열, 3과 4가 둘째 열, 5와 6이 셋째 열에 들어갑니다. 그래서 첫째 행은 1 3 5입니다. 행 방향으로 채우려면 byrow = TRUE를 줘야 합니다.
문제 3. 데이터프레임에 관한 설명으로 가장 적절한 것은?
데이터프레임은 속으로는 길이가 같은 벡터들의 리스트이므로, 열마다 다른 타입을 가질 수 있지만 한 열 안에서는 타입이 하나입니다. 모든 원소가 한 타입이어야 하는 것은 행렬입니다.
문제 4. 요인(factor)에 관한 설명으로 가장 적절한 것은?
요인은 범주형 값을 담는 그릇으로, 가능한 범주의 목록을 수준으로 함께 가집니다. 수준은 따로 정하지 않으면 입력 순서가 아니라 가나다순이나 알파벳순으로 정렬됩니다.

더 풀기

출제기준의 세부항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. R의 벡터에서 첫 번째 원소를 꺼내는 표현은 무엇입니까?
R은 순번이 1부터 시작하므로 첫 번째 원소는 x[1]입니다. x[0]은 아무 원소도 없는 빈 벡터를 돌려주고, x[-1]은 첫 번째 원소를 뺀 나머지를 돌려줍니다.
문제 2. R에서 c(1, TRUE, FALSE)의 결과는 무엇입니까?
숫자와 논리값을 섞으면 더 넓은 타입인 숫자로 맞춰져 TRUE는 1, FALSE는 0이 됩니다. 문자가 섞였다면 모두 문자가 되었을 것입니다.
문제 3. R에서 c(TRUE, "a")의 결과는 무엇입니까?
논리값과 문자를 섞으면 가장 넓은 타입인 문자로 맞춰져 TRUE가 "TRUE"라는 글자가 됩니다. 벡터는 한 가지 타입만 담기 때문입니다.
문제 4. 벡터에 타입이 다른 값을 섞어 넣었을 때 R이 맞추는 타입의 넓이 순서로 옳은 것은?
논리값, 숫자, 문자 순으로 넓어지며 섞으면 가장 넓은 쪽으로 맞춰집니다. 그래서 문자가 하나라도 끼면 전부 문자가 됩니다.
문제 5. R에서 c(1, 2, 3) + c(10, 20)을 계산하면 어떻게 됩니까?
짧은 벡터가 되풀이되어 10, 20, 10으로 맞춰진 뒤 더해져 11 22 13이 나옵니다. 다만 3이 2의 배수가 아니라서 R이 경고를 띄웁니다. 결과가 나왔다고 안심하면 안 되는 경우입니다.
문제 6. R의 벡터 연산이 가진 성질로 가장 적절한 것은?
R은 벡터 연산을 원소마다 자동으로 적용해 반복문 없이 계산합니다. 이 성질 덕분에 짧은 코드로 많은 데이터를 한꺼번에 다룰 수 있습니다.
문제 7. R에서 length(c(3, 1, 4, 1, 5))의 결과는 무엇입니까?
length는 벡터에 든 원소의 개수를 돌려주므로 5입니다. 원소들의 합인 14와 헷갈리지 않아야 합니다.
문제 8. R에서 class(10)의 결과로 가장 알맞은 것은?
그냥 10이라고 쓴 숫자는 실수형인 numeric으로 저장됩니다. 정수형으로 만들려면 10L처럼 뒤에 L을 붙여야 하며, 그때 class는 "integer"가 됩니다.
문제 9. R에서 정수형(integer) 값을 만들려면 어떻게 씁니까?
숫자 뒤에 L을 붙이면 정수형으로 저장됩니다. 그냥 10이나 10.0은 실수형 numeric이고, 따옴표로 감싼 "10"은 문자입니다.
문제 10. R이 통계 분석의 표준 도구가 된 이유로 가장 알맞은 것은?
R은 무료 오픈소스이고, 수많은 사람이 만든 패키지를 CRAN에서 내려받아 기능을 넓힐 수 있어 통계의 표준이 되었습니다. 인덱스는 0이 아니라 1부터 시작합니다.

묶음 2

문제 1. R을 만든 사람들로 옳은 것은?
R은 1990년대 초 오클랜드 대학의 로스 이하카와 로버트 젠틀먼이 만들었습니다. 나머지는 관계형 데이터베이스, 데이터 웨어하우스, 3V, 데이터 사이언스, 지식 창출로 알려진 사람들입니다.
문제 2. R이 본떠 만든 언어로 옳은 것은?
R은 벨 연구소에서 만든 통계 언어 S를 본떠 만들었습니다. 그래서 S로 작성된 코드 가운데 상당수가 R에서도 그대로 돌아갑니다.
문제 3. R에서 matrix(1:6, nrow = 2, byrow = TRUE)로 만든 행렬의 첫째 행은 무엇입니까?
byrow = TRUE를 주면 행 방향으로 채우므로 첫째 행에 1, 2, 3이 차례로 들어갑니다. 이 옵션이 없으면 열 방향으로 채워 첫째 행이 1 3 5가 됩니다.
문제 4. R에서 dim(matrix(1:6, nrow = 2))의 결과는 무엇입니까?
행이 2개이고 원소 6개를 채우니 열은 3개가 되어 dim은 행과 열의 수인 2 3을 돌려줍니다. dim은 행 수를 먼저, 열 수를 나중에 보여 줍니다.
문제 5. 행렬에 관한 설명으로 가장 적절한 것은?
행렬은 벡터에 가로와 세로의 모양을 입힌 것이라 모든 원소가 같은 타입이어야 합니다. 열마다 타입이 달라도 되는 것은 데이터프레임입니다.
문제 6. 세 방향 이상으로 값을 쌓은 자료 구조를 무엇이라고 부릅니까?
가로와 세로 두 방향이 행렬이라면, 그보다 방향이 많은 것은 배열(array)입니다. 배열도 행렬처럼 한 가지 타입만 담습니다.
문제 7. 리스트(list)의 특징으로 가장 적절한 것은?
리스트는 타입과 모양이 다른 것들을 한데 담을 수 있는 가장 자유로운 그릇입니다. 원소에 이름을 붙여 달러 기호로 꺼낼 수도 있습니다.
문제 8. p <- list(name = "지수", scores = c(90, 85))에서 점수 벡터를 꺼내는 표현으로 가장 알맞은 것은?
이름을 붙인 리스트의 원소는 리스트 이름 뒤에 달러 기호와 원소 이름을 적어 꺼냅니다. 그래서 p$scores가 90 85를 돌려줍니다.
문제 9. 리스트에서 대괄호를 한 겹으로 쓸 때와 두 겹으로 겹쳐 쓸 때의 차이로 옳은 것은?
대괄호 한 겹은 결과를 여전히 리스트로 감싸 돌려주고, 두 겹으로 겹쳐 쓰면 그 리스트를 벗겨 안의 원소 자체를 꺼냅니다. 이 차이 때문에 결과의 타입이 달라집니다.
문제 10. 데이터프레임의 속 구조로 가장 알맞은 것은?
데이터프레임은 겉보기에는 표이지만 속으로는 길이가 같은 벡터들을 열로 묶은 리스트입니다. 그래서 열마다 타입이 달라도 됩니다.

묶음 3

문제 1. df <- data.frame(name = c("지수", "유진"), score = c(90, 85))에서 dim(df)의 결과는 무엇입니까?
행이 두 명, 열이 name과 score 둘이라 dim은 2 2를 돌려줍니다. dim은 행 수를 먼저, 열 수를 나중에 보여 줍니다.
문제 2. 데이터프레임의 열 이름과 각 열의 타입을 한눈에 보여 주는 함수는 무엇입니까?
str은 데이터프레임의 구조, 곧 열 이름과 타입, 앞부분 값을 요약해 보여 줍니다. length는 원소 개수, sum은 합계를 구합니다.
문제 3. 데이터프레임에서 score 열만 벡터로 꺼내는 표현으로 가장 알맞은 것은?
데이터프레임도 속은 리스트라 달러 기호 뒤에 열 이름을 적어 그 열을 벡터로 꺼냅니다. 그래서 df$score가 90 85를 돌려줍니다.
문제 4. 데이터프레임의 한 열 안에 숫자와 문자를 섞어 넣으면 어떻게 됩니까?
데이터프레임은 열마다 타입이 달라도 되지만, 한 열은 하나의 벡터라 그 안에서는 타입이 하나로 통일됩니다. 숫자와 문자가 섞이면 벡터의 규칙대로 문자로 맞춰집니다.
문제 5. factor(c("low", "high", "low"))의 수준(levels)으로 옳은 것은?
수준은 가능한 범주의 목록이라 중복 없이 한 번씩만 들어가고, 따로 정하지 않으면 알파벳순으로 정렬되어 high가 low보다 앞섭니다. 입력 순서대로 정해지지 않는다는 점이 핵심입니다.
문제 6. "낮음, 보통, 높음"처럼 정해진 범주 가운데 하나를 가지는 값을 담기에 가장 알맞은 자료 구조는 무엇입니까?
정해진 범주 가운데 하나를 가지는 값은 수준 목록을 함께 들고 있는 요인으로 담는 것이 알맞습니다. 분류 모델의 목표 변수를 다룰 때 자주 씁니다.
문제 7. 다음 가운데 모든 원소가 한 가지 타입이어야 하는 자료 구조로만 짝지은 것은?
벡터와 행렬과 배열은 모든 원소가 같은 타입이어야 합니다. 리스트는 무엇이든 담고, 데이터프레임은 열마다 타입이 달라도 됩니다.
문제 8. R에서 1:5가 만드는 것은 무엇입니까?
콜론은 시작과 끝 사이의 정수를 차례로 만들어 1 2 3 4 5를 돌려줍니다. 1과 5 두 개만 담으려면 c(1, 5)라고 써야 합니다.
문제 9. R에서 값을 변수에 넣을 때 흔히 쓰는 기호로 옳은 것은?
R에서는 x <- 3처럼 화살표 모양으로 값을 넣는 것이 관례입니다. 등호 두 개는 같은지 비교하는 연산자, 느낌표를 붙인 것은 다른지 비교하는 연산자입니다.
문제 10. R의 자료 구조에 관한 진술로 옳지 않은 것은?
R은 순번이 1부터 시작해 첫 원소가 x[1]이고, x[0]은 빈 벡터를 돌려줍니다. 파이썬과 가장 다른 점이라 특히 조심해야 합니다. 나머지 셋은 옳은 진술입니다.

이전: 데이터분석 기획 5강 마스터 플랜과 거버넌스 · 다음: 2강 R로 데이터 다루기

모던지 · 궁금하면 모던지 GitHub · 2026-09-30