Using Databases using R.

See the RSQLite website.

library(tidyverse)
library(dplyr)
library(dbplyr)
library(RSQLite)
library(DBI)
library(beepr)
library(nycflights13)

In memory databases

mtcars data in an sqlite db

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con)
character(0)
dbWriteTable(con, "mtcars", mtcars)
dbListTables(con)
[1] "mtcars"
dbListFields(con, "mtcars")
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
dbReadTable(con, "mtcars")
res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con)

iris

con2 <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con2)
character(0)
dbWriteTable(con2, "iris", iris)
dbListTables(con2)
[1] "iris"
dbListFields(con2, "iris")
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
dbReadTable(con2, "iris")
res <- dbSendQuery(con2, "SELECT * FROM iris")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con2)

flights

con3 <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con3)
character(0)
copy_to(con3, nycflights13::flights, "flights",
  temporary = FALSE, 
  indexes = list(
    c("year", "month", "day"), 
    "carrier", 
    "tailnum",
    "dest"
  )
)

dbListTables(con3)
[1] "flights"      "sqlite_stat1" "sqlite_stat4"
dbListFields(con3, "flights")
 [1] "year"           "month"          "day"            "dep_time"      
 [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
 [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
[13] "origin"         "dest"           "air_time"       "distance"      
[17] "hour"           "minute"         "time_hour"     
dbReadTable(con3, "flights")
res <- dbSendQuery(con3, "SELECT * FROM flights WHERE day=1")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con3)

Using dplyr.

con4 <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con4)
character(0)
copy_to(con4, nycflights13::flights, "flights",
  temporary = FALSE, 
  indexes = list(
    c("year", "month", "day"), 
    "carrier", 
    "tailnum",
    "dest"
  )
)

flights_db <- tbl(con4, "flights")

flights_db

flights_db %>% select(year:day, dep_delay, arr_delay)

flights_db %>% filter(dep_delay > 240)

flights_db %>% 
  group_by(dest) %>%
  summarise(delay = mean(dep_time))

tailnum_delay_db <- flights_db %>% 
  group_by(tailnum) %>%
  summarise(
    delay = mean(arr_delay),
    n = n()
  ) %>% 
  arrange(desc(delay)) %>%
  filter(n > 100)

tailnum_delay_db

tailnum_delay_db %>% show_query()
<SQL>
SELECT *
FROM (SELECT *
FROM (SELECT `tailnum`, AVG(`arr_delay`) AS `delay`, COUNT() AS `n`
FROM `flights`
GROUP BY `tailnum`)
ORDER BY `delay` DESC)
WHERE (`n` > 100.0)
dbDisconnect(con4)

nycflights13 in a sqlite db saved to your harddrive in the data directory Write the nycflights to a db.

my_db_file <- "data/nycflights13_new.sqlite"
my_db <- src_sqlite(my_db_file, create = TRUE)

con <- dbConnect(RSQLite::SQLite(), "data/nycflights13_new.sqlite")

dbListTables(con)
character(0)
dbWriteTable(con, "flights", nycflights13::flights)
dbWriteTable(con, "planes", nycflights13::planes)
dbWriteTable(con, "airlines", nycflights13::airlines)
dbWriteTable(con, "airports", nycflights13::airports)
dbWriteTable(con, "weather", nycflights13::weather)


dbListTables(con)
[1] "airlines" "airports" "flights"  "planes"   "weather" 
dbListFields(con, "flights")
 [1] "year"           "month"          "day"            "dep_time"      
 [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
 [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
[13] "origin"         "dest"           "air_time"       "distance"      
[17] "hour"           "minute"         "time_hour"     
dbReadTable(con, "flights")
res <- dbSendQuery(con, "SELECT * FROM flights WHERE origin = 'JFK'")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con)

mtcars

my_db_file <- "data/mtcars.sqlite"
my_db <- src_sqlite(my_db_file, create = TRUE)

con <- dbConnect(RSQLite::SQLite(), "data/mtcars.sqlite")

dbListTables(con)
character(0)
dbWriteTable(con, "mtcars", mtcars)
dbListTables(con)
[1] "mtcars"
dbListFields(con, "mtcars")
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
dbReadTable(con, "mtcars")
res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con)

iris

my_db_file <- "data/iris.sqlite"
my_db <- src_sqlite(my_db_file, create = TRUE)

con <- dbConnect(RSQLite::SQLite(), "data/iris.sqlite")

dbListTables(con)
character(0)
dbWriteTable(con, "iris", iris)
dbListTables(con)
[1] "iris"
dbListFields(con, "iris")
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
dbReadTable(con, "iris")
res <- dbSendQuery(con, " SELECT * FROM iris WHERE Species = 'setosa' ")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con)

gapmider

library(gapminder)

my_db_file <- "data/gapminder.sqlite"
my_db <- src_sqlite(my_db_file, create = TRUE)

con <- dbConnect(RSQLite::SQLite(), "data/gapminder.sqlite")

dbListTables(con)
character(0)
dbWriteTable(con, "gapminder", gapminder)
dbListTables(con)
[1] "gapminder"
dbListFields(con, "gapminder")
[1] "country"   "continent" "year"      "lifeExp"   "pop"       "gdpPercap"
dbReadTable(con, "gapminder")
res <- dbSendQuery(con, " SELECT * FROM gapminder WHERE Country = 'United States' ")
dbFetch(res)
dbClearResult(res)
dbDisconnect(con)

All three tables in one database

my_db_file <- "data/all_4.sqlite"
my_db <- src_sqlite(my_db_file, create = TRUE)

con <- dbConnect(RSQLite::SQLite(), "data/all_4.sqlite")

dbListTables(con)
character(0)
dbWriteTable(con, "mtcars", mtcars)
dbWriteTable(con, "iris", iris)
dbWriteTable(con, "gapmider", gapminder)
dbWriteTable(con, "flights", flights)

dbListTables(con)
[1] "flights"  "gapmider" "iris"     "mtcars"  
dbListFields(con, "iris")
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
dbListFields(con, "flights")
 [1] "year"           "month"          "day"            "dep_time"      
 [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
 [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
[13] "origin"         "dest"           "air_time"       "distance"      
[17] "hour"           "minute"         "time_hour"     
dbDisconnect(con)
LS0tCnRpdGxlOiAiZGJwbHlyIgphdXRob3I6ICJQcm9mLiBFcmljIEEuIFN1ZXNzIgpkYXRlOiAiMjAyMC8wNi8xNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKVXNpbmcgW0RhdGFiYXNlcyB1c2luZyBSXShodHRwczovL2RiLnJzdHVkaW8uY29tLykuCgpTZWUgdGhlIFtSU1FMaXRlXShodHRwczovL3JzcWxpdGUuci1kYmkub3JnL2FydGljbGVzL3JzcWxpdGUpIHdlYnNpdGUuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShkYnBseXIpCmxpYnJhcnkoUlNRTGl0ZSkKbGlicmFyeShEQkkpCmxpYnJhcnkoYmVlcHIpCmxpYnJhcnkobnljZmxpZ2h0czEzKQoKYGBgCgojIEluIG1lbW9yeSBkYXRhYmFzZXMKCiMjIG10Y2FycyBkYXRhIGluIGFuIHNxbGl0ZSBkYgoKYGBge3J9CmNvbiA8LSBkYkNvbm5lY3QoUlNRTGl0ZTo6U1FMaXRlKCksICI6bWVtb3J5OiIpCgpkYkxpc3RUYWJsZXMoY29uKQoKZGJXcml0ZVRhYmxlKGNvbiwgIm10Y2FycyIsIG10Y2FycykKZGJMaXN0VGFibGVzKGNvbikKZGJMaXN0RmllbGRzKGNvbiwgIm10Y2FycyIpCmRiUmVhZFRhYmxlKGNvbiwgIm10Y2FycyIpCnJlcyA8LSBkYlNlbmRRdWVyeShjb24sICJTRUxFQ1QgKiBGUk9NIG10Y2FycyBXSEVSRSBjeWwgPSA0IikKZGJGZXRjaChyZXMpCmRiQ2xlYXJSZXN1bHQocmVzKQpkYkRpc2Nvbm5lY3QoY29uKQpgYGAKCiMjIGlyaXMKCmBgYHtyfQpjb24yIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgIjptZW1vcnk6IikKCmRiTGlzdFRhYmxlcyhjb24yKQoKZGJXcml0ZVRhYmxlKGNvbjIsICJpcmlzIiwgaXJpcykKZGJMaXN0VGFibGVzKGNvbjIpCmRiTGlzdEZpZWxkcyhjb24yLCAiaXJpcyIpCmRiUmVhZFRhYmxlKGNvbjIsICJpcmlzIikKcmVzIDwtIGRiU2VuZFF1ZXJ5KGNvbjIsICJTRUxFQ1QgKiBGUk9NIGlyaXMiKQpkYkZldGNoKHJlcykKZGJDbGVhclJlc3VsdChyZXMpCmRiRGlzY29ubmVjdChjb24yKQpgYGAKCiMjIGZsaWdodHMKCmBgYHtyfQpjb24zIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgIjptZW1vcnk6IikKCmRiTGlzdFRhYmxlcyhjb24zKQoKY29weV90byhjb24zLCBueWNmbGlnaHRzMTM6OmZsaWdodHMsICJmbGlnaHRzIiwKICB0ZW1wb3JhcnkgPSBGQUxTRSwgCiAgaW5kZXhlcyA9IGxpc3QoCiAgICBjKCJ5ZWFyIiwgIm1vbnRoIiwgImRheSIpLCAKICAgICJjYXJyaWVyIiwgCiAgICAidGFpbG51bSIsCiAgICAiZGVzdCIKICApCikKCmRiTGlzdFRhYmxlcyhjb24zKQpkYkxpc3RGaWVsZHMoY29uMywgImZsaWdodHMiKQpkYlJlYWRUYWJsZShjb24zLCAiZmxpZ2h0cyIpCnJlcyA8LSBkYlNlbmRRdWVyeShjb24zLCAiU0VMRUNUICogRlJPTSBmbGlnaHRzIFdIRVJFIGRheT0xIikKZGJGZXRjaChyZXMpCmRiQ2xlYXJSZXN1bHQocmVzKQpkYkRpc2Nvbm5lY3QoY29uMykKCmBgYAoKIyBVc2luZyBkcGx5ci4KCmBgYHtyfQpjb240IDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgIjptZW1vcnk6IikKCmRiTGlzdFRhYmxlcyhjb240KQoKY29weV90byhjb240LCBueWNmbGlnaHRzMTM6OmZsaWdodHMsICJmbGlnaHRzIiwKICB0ZW1wb3JhcnkgPSBGQUxTRSwgCiAgaW5kZXhlcyA9IGxpc3QoCiAgICBjKCJ5ZWFyIiwgIm1vbnRoIiwgImRheSIpLCAKICAgICJjYXJyaWVyIiwgCiAgICAidGFpbG51bSIsCiAgICAiZGVzdCIKICApCikKCmZsaWdodHNfZGIgPC0gdGJsKGNvbjQsICJmbGlnaHRzIikKCmZsaWdodHNfZGIKCmZsaWdodHNfZGIgJT4lIHNlbGVjdCh5ZWFyOmRheSwgZGVwX2RlbGF5LCBhcnJfZGVsYXkpCgpmbGlnaHRzX2RiICU+JSBmaWx0ZXIoZGVwX2RlbGF5ID4gMjQwKQoKZmxpZ2h0c19kYiAlPiUgCiAgZ3JvdXBfYnkoZGVzdCkgJT4lCiAgc3VtbWFyaXNlKGRlbGF5ID0gbWVhbihkZXBfdGltZSkpCgp0YWlsbnVtX2RlbGF5X2RiIDwtIGZsaWdodHNfZGIgJT4lIAogIGdyb3VwX2J5KHRhaWxudW0pICU+JQogIHN1bW1hcmlzZSgKICAgIGRlbGF5ID0gbWVhbihhcnJfZGVsYXkpLAogICAgbiA9IG4oKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhkZWxheSkpICU+JQogIGZpbHRlcihuID4gMTAwKQoKdGFpbG51bV9kZWxheV9kYgoKdGFpbG51bV9kZWxheV9kYiAlPiUgc2hvd19xdWVyeSgpCgpkYkRpc2Nvbm5lY3QoY29uNCkKYGBgCgpueWNmbGlnaHRzMTMgaW4gYSBzcWxpdGUgZGIgc2F2ZWQgdG8geW91ciBoYXJkZHJpdmUgaW4gdGhlIGRhdGEgZGlyZWN0b3J5CldyaXRlIHRoZSBueWNmbGlnaHRzIHRvIGEgZGIuCgpgYGB7cn0KbXlfZGJfZmlsZSA8LSAiZGF0YS9ueWNmbGlnaHRzMTNfbmV3LnNxbGl0ZSIKbXlfZGIgPC0gc3JjX3NxbGl0ZShteV9kYl9maWxlLCBjcmVhdGUgPSBUUlVFKQoKY29uIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgImRhdGEvbnljZmxpZ2h0czEzX25ldy5zcWxpdGUiKQoKZGJMaXN0VGFibGVzKGNvbikKCmRiV3JpdGVUYWJsZShjb24sICJmbGlnaHRzIiwgbnljZmxpZ2h0czEzOjpmbGlnaHRzKQpkYldyaXRlVGFibGUoY29uLCAicGxhbmVzIiwgbnljZmxpZ2h0czEzOjpwbGFuZXMpCmRiV3JpdGVUYWJsZShjb24sICJhaXJsaW5lcyIsIG55Y2ZsaWdodHMxMzo6YWlybGluZXMpCmRiV3JpdGVUYWJsZShjb24sICJhaXJwb3J0cyIsIG55Y2ZsaWdodHMxMzo6YWlycG9ydHMpCmRiV3JpdGVUYWJsZShjb24sICJ3ZWF0aGVyIiwgbnljZmxpZ2h0czEzOjp3ZWF0aGVyKQoKCmRiTGlzdFRhYmxlcyhjb24pCmRiTGlzdEZpZWxkcyhjb24sICJmbGlnaHRzIikKZGJSZWFkVGFibGUoY29uLCAiZmxpZ2h0cyIpCnJlcyA8LSBkYlNlbmRRdWVyeShjb24sICJTRUxFQ1QgKiBGUk9NIGZsaWdodHMgV0hFUkUgb3JpZ2luID0gJ0pGSyciKQpkYkZldGNoKHJlcykKZGJDbGVhclJlc3VsdChyZXMpCmRiRGlzY29ubmVjdChjb24pCmBgYAoKIyBtdGNhcnMKCmBgYHtyfQpteV9kYl9maWxlIDwtICJkYXRhL210Y2Fycy5zcWxpdGUiCm15X2RiIDwtIHNyY19zcWxpdGUobXlfZGJfZmlsZSwgY3JlYXRlID0gVFJVRSkKCmNvbiA8LSBkYkNvbm5lY3QoUlNRTGl0ZTo6U1FMaXRlKCksICJkYXRhL210Y2Fycy5zcWxpdGUiKQoKZGJMaXN0VGFibGVzKGNvbikKCmRiV3JpdGVUYWJsZShjb24sICJtdGNhcnMiLCBtdGNhcnMpCmRiTGlzdFRhYmxlcyhjb24pCmRiTGlzdEZpZWxkcyhjb24sICJtdGNhcnMiKQpkYlJlYWRUYWJsZShjb24sICJtdGNhcnMiKQpyZXMgPC0gZGJTZW5kUXVlcnkoY29uLCAiU0VMRUNUICogRlJPTSBtdGNhcnMgV0hFUkUgY3lsID0gNCIpCmRiRmV0Y2gocmVzKQpkYkNsZWFyUmVzdWx0KHJlcykKZGJEaXNjb25uZWN0KGNvbikKYGBgCgojIGlyaXMKCmBgYHtyfQpteV9kYl9maWxlIDwtICJkYXRhL2lyaXMuc3FsaXRlIgpteV9kYiA8LSBzcmNfc3FsaXRlKG15X2RiX2ZpbGUsIGNyZWF0ZSA9IFRSVUUpCgpjb24gPC0gZGJDb25uZWN0KFJTUUxpdGU6OlNRTGl0ZSgpLCAiZGF0YS9pcmlzLnNxbGl0ZSIpCgpkYkxpc3RUYWJsZXMoY29uKQoKZGJXcml0ZVRhYmxlKGNvbiwgImlyaXMiLCBpcmlzKQpkYkxpc3RUYWJsZXMoY29uKQpkYkxpc3RGaWVsZHMoY29uLCAiaXJpcyIpCmRiUmVhZFRhYmxlKGNvbiwgImlyaXMiKQpyZXMgPC0gZGJTZW5kUXVlcnkoY29uLCAiIFNFTEVDVCAqIEZST00gaXJpcyBXSEVSRSBTcGVjaWVzID0gJ3NldG9zYScgIikKZGJGZXRjaChyZXMpCmRiQ2xlYXJSZXN1bHQocmVzKQpkYkRpc2Nvbm5lY3QoY29uKQpgYGAKCiMgZ2FwbWlkZXIKCmBgYHtyfQpsaWJyYXJ5KGdhcG1pbmRlcikKCm15X2RiX2ZpbGUgPC0gImRhdGEvZ2FwbWluZGVyLnNxbGl0ZSIKbXlfZGIgPC0gc3JjX3NxbGl0ZShteV9kYl9maWxlLCBjcmVhdGUgPSBUUlVFKQoKY29uIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgImRhdGEvZ2FwbWluZGVyLnNxbGl0ZSIpCgpkYkxpc3RUYWJsZXMoY29uKQoKZGJXcml0ZVRhYmxlKGNvbiwgImdhcG1pbmRlciIsIGdhcG1pbmRlcikKZGJMaXN0VGFibGVzKGNvbikKZGJMaXN0RmllbGRzKGNvbiwgImdhcG1pbmRlciIpCmRiUmVhZFRhYmxlKGNvbiwgImdhcG1pbmRlciIpCnJlcyA8LSBkYlNlbmRRdWVyeShjb24sICIgU0VMRUNUICogRlJPTSBnYXBtaW5kZXIgV0hFUkUgQ291bnRyeSA9ICdVbml0ZWQgU3RhdGVzJyAiKQpkYkZldGNoKHJlcykKZGJDbGVhclJlc3VsdChyZXMpCmRiRGlzY29ubmVjdChjb24pCmBgYAoKCiMgQWxsIHRocmVlIHRhYmxlcyBpbiBvbmUgZGF0YWJhc2UKCmBgYHtyfQpteV9kYl9maWxlIDwtICJkYXRhL2FsbF80LnNxbGl0ZSIKbXlfZGIgPC0gc3JjX3NxbGl0ZShteV9kYl9maWxlLCBjcmVhdGUgPSBUUlVFKQoKY29uIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgImRhdGEvYWxsXzQuc3FsaXRlIikKCmRiTGlzdFRhYmxlcyhjb24pCgpkYldyaXRlVGFibGUoY29uLCAibXRjYXJzIiwgbXRjYXJzKQpkYldyaXRlVGFibGUoY29uLCAiaXJpcyIsIGlyaXMpCmRiV3JpdGVUYWJsZShjb24sICJnYXBtaWRlciIsIGdhcG1pbmRlcikKZGJXcml0ZVRhYmxlKGNvbiwgImZsaWdodHMiLCBmbGlnaHRzKQoKZGJMaXN0VGFibGVzKGNvbikKCmRiTGlzdEZpZWxkcyhjb24sICJpcmlzIikKZGJMaXN0RmllbGRzKGNvbiwgImZsaWdodHMiKQoKZGJEaXNjb25uZWN0KGNvbikKYGBgCgoK