iBetter Books
수정

Ch 01. tibble과 data.frame

R을 처음 배우면 data.frame으로 시작합니다. 행과 열로 이루어진 표 형태의 자료 구조로, R의 가장 기본적인 데이터 저장 방식입니다. tidyverse는 여기서 한 발 더 나아갑니다. tibble이라는 새로운 형태의 data.frame을 제안합니다.

tibble은 data.frame과 완전히 호환되면서도, 몇 가지 중요한 개선점을 가지고 있습니다. 어떤 점이 다른지 직접 비교해보겠습니다.

data.frame의 한계

data.frame을 만들고 출력해봅니다.

# data.frame 생성
df <- data.frame(
  name = c("Alice", "Bob", "Charlie", "Diana", "Eve"),
  age  = c(25, 30, 35, 28, 22),
  score = c(88.5, 72.0, 95.3, 61.8, 79.4)
)

df

출력 결과는 이렇습니다.

     name age score
1   Alice  25  88.5
2     Bob  30  72.0
3 Charlie  35  95.3
4   Diana  28  61.8
5     Eve  22  79.4

행이 적을 때는 문제가 없습니다. 그런데 데이터가 수천 행, 수십 열이 되면 어떨까요. 모든 행이 쏟아져 나와 콘솔이 가득 찹니다. 열 유형도 표시되지 않아 각 열이 숫자인지 문자인지 한눈에 파악하기 어렵습니다.

data.frame에는 또 다른 함정이 있습니다. 부분 열 이름 매칭입니다.

df$na   # "na"만 입력해도 name 열이 반환됨
[1] "Alice"   "Bob"     "Charlie" "Diana"   "Eve"

타이핑 실수인지 의도적인 축약인지 구분할 수 없습니다. 큰 프로젝트에서 이런 동작은 예상치 못한 버그의 원인이 됩니다.

tibble 소개

tibble을 사용하려면 tibble 패키지 또는 tidyverse를 불러옵니다.

library(tidyverse)

tb <- tibble(
  name  = c("Alice", "Bob", "Charlie", "Diana", "Eve"),
  age   = c(25, 30, 35, 28, 22),
  score = c(88.5, 72.0, 95.3, 61.8, 79.4)
)

tb

출력이 달라집니다.

# A tibble: 5 × 3
  name      age score
  <chr>   <dbl> <dbl>
1 Alice      25  88.5
2 Bob        30  72.0
3 Charlie    35  95.3
4 Diana      28  61.8
5 Eve        22  79.4

첫 줄에 "# A tibble: 5 × 3"이 나타납니다. 행과 열의 개수를 즉시 알 수 있습니다. 열 이름 아래 <chr>, <dbl> 같은 자료형이 표시됩니다. 데이터를 보자마자 각 열의 성격이 파악됩니다.

데이터가 많을 때는 자동으로 처음 10행만 출력합니다. 콘솔이 넘쳐흐르지 않습니다.

tibble의 엄격한 열 선택

tibble은 부분 매칭을 허용하지 않습니다.

tb$na   # 경고와 함께 NULL 반환
Warning message:
Unknown or uninitialised column: `na`.
NULL

실수를 즉시 알아챌 수 있습니다. 정확한 열 이름을 써야 합니다.

tb$name   # 정확한 이름만 동작
[1] "Alice"   "Bob"     "Charlie" "Diana"   "Eve"

data.frame을 tibble로 변환하기

기존 data.frame을 tibble로 바꾸려면 as_tibble()을 사용합니다. R 내장 데이터셋 iris로 해보겠습니다.

# iris는 기본 data.frame
class(iris)
[1] "data.frame"
# tibble로 변환
iris_tb <- as_tibble(iris)
iris_tb
# A tibble: 150 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5            3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5            3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ℹ 140 more rows

150행인데 처음 10행만 보입니다. 맨 아래에 "140 more rows"가 표시됩니다. 필요하면 print(iris_tb, n = 20)처럼 출력할 행 수를 지정할 수 있습니다.

tribble로 행 단위 입력

tribble()은 행 단위로 데이터를 입력할 때 편리합니다. 열 이름 앞에 ~를 붙입니다.

survey <- tribble(
  ~name,     ~city,    ~age,
  "철수",   "서울",    28,
  "영희",   "부산",    32,
  "민준",   "대구",    25
)

survey
# A tibble: 3 × 3
  name  city    age
  <chr> <chr> <dbl>
1 철수  서울     28
2 영희  부산     32
3 민준  대구     25

데이터를 손으로 만들어 테스트할 때 자주 씁니다. 열 이름과 값이 시각적으로 정렬되어 있어 오타를 찾기도 쉽습니다.

tibble과 data.frame, 무엇을 써야 할까

tibble은 data.frame의 상위 호환입니다. data.frame을 받는 함수에 tibble을 그대로 넣어도 동작합니다. tidyverse의 모든 함수는 tibble을 기본으로 사용합니다.

앞으로 이 교재에서는 특별한 언급이 없으면 tibble을 사용합니다. 데이터를 불러오거나 만들 때 자동으로 tibble 형태가 됩니다.

이제 실제 데이터를 파일에서 불러오는 방법을 살펴봅니다.