R 티블(tibble) 사용법 및 차이점

R을 처음 입문으로 배우면 엑셀의 표와 화면상에 똑같이 생긴 직사각형 행/열 구조인 베이스 함수의 데이터 프레임(Data Frame, data.frame())을 가장 먼저 배우게 됩니다. 하지만 빅데이터 시대에 맞게 데이터 분석 생태계가 점차 폭발적으로 발전하면서, 구식 데이터 프레임의 무겁고 짜증나는 단점들을 완벽하게 보완하고 최적화한 최신형의 스마트 엑셀 표인 티블(tibble)이 새롭게 등장하여, 현재는 모든 데이터 핸들링 분석의 흔들리지 않는 초석으로 대세가 되어 완전히 자리 잡았습니다.

명실상부 전 세계 모든 R 데이터 분석가들의 필수 표준 패키지인 tidyverse 생태계를 강력하게 백그라운드 코어에서 이끌고 있는 tibble 프레임이, 기존 베이스 데이터 프레임과 구체적으로 어떤 기술적 차이가 있는지, 그리고 어떻게 다루고 파생시키는지 명확하고 빠르게 코드로 정리해보겠습니다.

1. 왜 무조건 tibble 테이블을 써야 할까요? (기존 구조와의 차이점)

tibble 객체는 기존의 data.frame()과 겉보기 생김새는 똑같고 하위 호환성은 100% 유지하지만, 사람을 배려한 작업의 편의성을 위해 몇 가지 똑똑한 출력/제어 트릭 기능들이 추가되었습니다.

  1. 열의 데이터 타입(Class) 자동 메타 표시: tibble을 콘솔 창에 출력하면, 변수 열 이름 바로 그 밑에 <dbl>(Double, 실수), <int>(정수), <chr>(Character, 문자), <fct>(Factor) 처럼 데이터 원형의 타입이 짧은 약어로 무조건 표시되어 구조 파악을 위한 str() 없이도 즉각적으로 통제가 가능해 매우 직관적입니다.
  2. 화면이 터지면서 수만 줄 스크롤이 내려가는 과부하 방지 (일부 깔끔한 표시): 기존 베이스 데이터 프레임은 행이 1만 개면 콘솔 블랙홀에 1만 개를 다이렉트로 쏟아내며 PC를 멈춰버렸습니다. tibble은 똑똑하게 딱 터미널 화면에 볼 수 있을 만큼(기본 앞쪽 10줄, 너비만큼의 열 수)만 깔끔하게 끊어서 보여주고 뒷부분을 요약 생략 처리합니다.
  3. 생성할 때 앞쪽 생성된 컬럼을 뒤쪽에서 바로 연쇄 연산 활용 가능: tibble()은 변수를 만들면서, 동시에 즉각적으로 그 선행 변수를 밑줄에서 산술로 호출해 활용하여 새로운 두 번째 파생 변수를 마법처럼 세팅할 수 있습니다.
library(tidyverse)

# data.frame은 동시 생성이 불가능하지만, 
# tibble 안에서는 변수를 만들면서 x를 곧바로 가져다가 y 산출 폼에 활용 가능!
my_tb <- tibble(x = 1:5, y = x^2)
my_tb
> # A tibble: 5 × 2
>       x     y
>   <int> <dbl>
> 1     1     1
> 2     2     4
> 3     3     9
> 4     4    16
> 5     5    25

2. 기존 낡은 데이터 프레임을 tibble로 포물선 변신시키기

외부에서 다른 사람이 만든 낡은 Base 데이터 프레임이나, R에 영원히 기본 탑재된 교육용 내장 데이터 셋(예: iris, mtcars)들은 여전히 구식 data.frame입니다. 코드를 실행해보면 알게 모르게 엄청난 출력 폭격을 경험하게 되실 겁니다.
이럴 때는 가차없이 as_tibble() 함수로 덮어 씌워서 한방에 최신형 UI로 바꿔줄 수 있습니다.

# 기존 베이스 내장 데이터셋(mtcars 자동차정보)을 스마트한 tibble 코팅으로 변환
mtcars_tbl <- as_tibble(mtcars)
head(mtcars_tbl, 2)
> # A tibble: 2 × 11
>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4

단, 주의사항이 한 개 있습니다! tibble은 고질적인 문제이자 가독성을 해치던 조잡한 “행 자체에 이름 박기(Row Name)”의 디자인 존재를 공식적으로 철폐 및 폐지했습니다. 만약 행 이름(ex. 자동차 모델명)이 분석에 중요한 고유 키(PK Key) 값이었다면 옵션을 써서 독립적인 진짜 열(Column)로 살려내어 구조를 바로잡아야 합니다.

# 행 이름이던 걸 model 이라는 진짜 1번째 열 데이터 공간으로 끌어내리기
as_tibble(mtcars, rownames = "model") |> head(2)
> # A tibble: 2 × 12
>   model         mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
>   <chr>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
> 1 Mazda RX4      21     6   160   110  3.9   2.62  16.5     0     1     4     4
> 2 Mazda RX4 …    21     6   160   110  3.9   2.88  17.0     0     1     4     4

3. 손으로 직접 미니 tibble을 가로 배치 타이핑하기 (tribble)

가끔은 실무에서 번거롭게 외부 엑셀 CSV 파일을 새로 파기도 민망할 만큼 작은 참조 표(코드북, 지역코드표, 간단한 매핑 테이블)를 스크립트 코드 내에 직접 손으로 그려야 할 때가 있습니다. 이 때는 무식하게 c(), c(), c()를 쓰지 말고, row(가로 행 넓이 직관) 단위로 띄어쓰기 맞춰 바로 시각적으로 입력해 버리는 tribble() 함수를 쓰면 그야말로 환상적인 효율이 나옵니다.

# Transposed Tibble의 약자입니다.
tab_a <- tribble(
     ~id, ~score, ~group,
    1L,    35,   "A",
    3L,    70,   "A",
    4L,    63,   "B",
    5L,    80,   "B"
    )

tab_a
> # A tibble: 4 × 3
>      id score group
>   <int> <dbl> <chr>
> 1     1    35 A    
> 2     3    70 A    
> 3     4    63 B    
> 4     5    80 B    

맨 윗줄은 물결(~ 틸드) 기호로 열의 제목을 명명해 달아주고, 그 아래로는 실제 표 모양대로 쉼표(,)와 줄 바꿈을 넣어 타이핑만 하면 깔끔하게 끝납니다! 협업 시 동료의 코드 가독성이 말도 안 되게 올라갑니다.

4. tibble 인덱싱과 subset(조건부 부분 필터링)

기본적으로 단일 열의 데이터를 꺼낼 때 달러($) 기호를 쓰는 것은 기존 체계 모델과 동일합니다. 하지만 특정 조건으로 하위 행(rows)을 발라내어 살을 치고 싶을 때, 고전적인 형태보단 베이스의 subset() 함수(혹은 dplyr::filter())를 쓰는 것이 코드를 지저분함 없이 미니멀하게 만들어줍니다.

my_tb <- tibble(id=1:10, score=c(45, 60, 75, 80, 55, 90, 85, 30, 100, 65))

# 고전 구시대적인 데이터 프레임 필터링 방식 (이름인 my_tb$를 촌스럽게 두 번 써야 함)
my_tb[my_tb$score <= 60, ] 

# subset을 활용한 우아한 방식 (내부에서 이름 한 번만)
subset(my_tb, score <= 60)
> # A tibble: 4 × 2
>      id score
>   <int> <dbl>
> 1     1    45
> 2     2    60
> 3     5    55
> 4     8    30

명심하세요. 최근 출시되는 대부분의 모든 R 데이터 부문 분석 문헌과 글로벌 패키지들은 모두 이 최신 규격인 tibble을 기본 반환 포맷으로 가정하고 작성되어 있습니다. 구식 data.frame()과 똑같이 돌아가지만 훨씬 스마트하고 영리한 이 tibble과 빨리, 무엇보다 제일 먼저 단숨에 친해지시길 간곡히 권장 드립니다!


당신이 좋아할 만한 콘텐츠

by Google Adsense


관련 글 보기