[rtips] DBI 소스의 tbl의 요약 정보 확인하기 glimpse()

R glimpse str tbl dbi dplyr

src_dbi인 tbl의 str()을 확인할 때는 dplyr::glimpse() 함수를 사용하세요.

true
2019-01-25

한줄요약

  1. src_dbi인 tbl의 str()을 확인할 때는 dplyr::glimpse() 함수를 사용하세요.

str() 함수는 매우 유용합니다. 복잡한 데이터의 구조를 한눈에 보여주는 R의 효자 함수지요. 그런데 DBI을 이용한 table 객체를 사용할 때 문제가 있습니다.

문제상황을 만들기 위해 sqlite를 사용해서 테이블을 만들어 보겠습니다.

library(DBI)
library(RSQLite)
library(dplyr)
tb <- dbConnect(SQLite(), ":memory:")
tb
<SQLiteConnection>
  Path: :memory:
  Extensions: TRUE
copy_to(tb, mtcars)
mtcars_sql <- tbl(tb, "mtcars")       

유용한 내장 데이터인 mtcars 데이터셋을 sqlite로 저장하고, dplyr::tbl() 함수로 테이블 객체를 불러왔습니다. 이제 데이터를 살펴볼 때 유용한 함수인 str()로 데이터를 확인해보겠습니다. 우선 R 객체인 mtcars를 확인해 볼까요?

str(mtcars)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

그리고 테이블 객체로 저장한 mtcars_sql을 확인해보겠습니다.

str(mtcars_sql)
List of 2
 $ src:List of 2
  ..$ con  :Formal class 'SQLiteConnection' [package "RSQLite"] with 8 slots
  .. .. ..@ ptr                :<externalptr> 
  .. .. ..@ dbname             : chr ":memory:"
  .. .. ..@ loadable.extensions: logi TRUE
  .. .. ..@ flags              : int 70
  .. .. ..@ vfs                : chr ""
  .. .. ..@ ref                :<environment: 0x7fdc3b4c7770> 
  .. .. ..@ bigint             : chr "integer64"
  .. .. ..@ extended_types     : logi FALSE
  ..$ disco: NULL
  ..- attr(*, "class")= chr [1:4] "src_SQLiteConnection" "src_dbi" "src_sql" "src"
 $ ops:List of 2
  ..$ x   : 'ident' chr "mtcars"
  ..$ vars: chr [1:11] "mpg" "cyl" "disp" "hp" ...
  ..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
 - attr(*, "class")= chr [1:5] "tbl_SQLiteConnection" "tbl_dbi" "tbl_sql" "tbl_lazy" ...

확실히 기대하는 모양이랑 좀 다릅니다. 테이블 객체 자체에 대한 정보를 보여주는군요.

제가 다루는 db의 테이블들은 컬럼이 몇 십개씩 있거나 하기도 합니다.

tibble 자료형이 매우 좋은 요약정보를 제공합니다만, 컬럼이 많아지면 한눈에 보기 불편한 문제가 있습니다.

# A tibble: 336,776 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     1      517            515         2      830
 2  2013     1     1      533            529         4      850
 3  2013     1     1      542            540         2      923
 4  2013     1     1      544            545        -1     1004
 5  2013     1     1      554            600        -6      812
 6  2013     1     1      554            558        -4      740
 7  2013     1     1      555            600        -5      913
 8  2013     1     1      557            600        -3      709
 9  2013     1     1      557            600        -3      838
10  2013     1     1      558            600        -2      753
# … with 336,766 more rows, and 12 more variables:
#   sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
#   flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
#   time_hour <dttm>

이렇게 화면을 벗어나게 컬럼이 많으면 값들의 일부조차도 요약해서 보여주죠. 물론 컬럼 출력 옵션을 조정할 수 도 있습니다. 하지만 그런 커스텀이 많아지는걸 저는 좋아하지 않습니다.

대신 dplyr::glimpse() 함수를 제공한다는 사실을 알게되었습니다. 대체 dbi src str 같은 검색을 죽어라 할 때는 없더니… 등잔밑이 어둡다가 정말 이럴때 쓰는 말인가 싶더군요.

glimpse(mtcars_sql)
Rows: ??
Columns: 11
Database: sqlite 3.38.2 [:memory:]
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 1…
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4…
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7,…
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180…
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3…
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190,…
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00,…
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1…
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1…
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4…
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2…

db를 소스로 사용하는 테이블 객체를 살펴볼 때 필수 함수가 아닐까 싶습니다. flights 데이터로 한번 더 비교하면서 글 마무리하겠습니다. 감사합니다.

copy_to(tb, flights)
flights_sql <- tbl(tb, "flights")
str(flights_sql)
List of 2
 $ src:List of 2
  ..$ con  :Formal class 'SQLiteConnection' [package "RSQLite"] with 8 slots
  .. .. ..@ ptr                :<externalptr> 
  .. .. ..@ dbname             : chr ":memory:"
  .. .. ..@ loadable.extensions: logi TRUE
  .. .. ..@ flags              : int 70
  .. .. ..@ vfs                : chr ""
  .. .. ..@ ref                :<environment: 0x7fdc3b4c7770> 
  .. .. ..@ bigint             : chr "integer64"
  .. .. ..@ extended_types     : logi FALSE
  ..$ disco: NULL
  ..- attr(*, "class")= chr [1:4] "src_SQLiteConnection" "src_dbi" "src_sql" "src"
 $ ops:List of 2
  ..$ x   : 'ident' chr "flights"
  ..$ vars: chr [1:19] "year" "month" "day" "dep_time" ...
  ..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
 - attr(*, "class")= chr [1:5] "tbl_SQLiteConnection" "tbl_dbi" "tbl_sql" "tbl_lazy" ...
glimpse(flights_sql)
Rows: ??
Columns: 19
Database: sqlite 3.38.2 [:memory:]
$ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 201…
$ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, …
$ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, …
$ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, …
$ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838,…
$ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846,…
$ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2,…
$ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV…
$ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, …
$ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668…
$ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EW…
$ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FL…
$ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 1…
$ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, …
$ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, …
$ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0…
$ time_hour      <dbl> 1357034400, 1357034400, 1357034400, 135703440…

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-NC-ND 4.0. Source code is available at https://github.com/mrchypark/mrchypark.github.io, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Park (2019, Jan. 25). mrchypark: [rtips] DBI 소스의 tbl의 요약 정보 확인하기 glimpse(). Retrieved from https://mrchypark.github.io/post/rtips-dbi-소스의-tbl의-요약-정보-확인하기-glimpse/

BibTeX citation

@misc{park2019[rtips],
  author = {Park, Chanyub},
  title = {mrchypark: [rtips] DBI 소스의 tbl의 요약 정보 확인하기 glimpse()},
  url = {https://mrchypark.github.io/post/rtips-dbi-소스의-tbl의-요약-정보-확인하기-glimpse/},
  year = {2019}
}