Манипуляция данными с помощью SQL запросов в R
В целом я не особо приветствую использования SQL, внутри / вместо R, т.к. функционал самого R гораздо богаче. Тем не менее знать о такой возможности стоит.
Ранее для манипуляции данными с помощью SQL запросов зачастую использовали пакет sqldf, который последний раз обновлялся ещё в далёком 2017 году. На смену устаревшему пакету пришел новый - tidyquery.
Данный пакет содержит всего 2 функции:
● query() - реализует манипуляцию данными с помощью SQL запросов
● show_dplyr() - транслирует ваш SQL запрос в dplyr код
Пример манипуляции данными с помощью query():
library(tidyquery)
library(nycflights13)
library(dplyr)
query(
" SELECT origin, dest,
COUNT(flight) AS num_flts,
round(SUM(seats)) AS num_seats,
round(AVG(arr_delay)) AS avg_delay
FROM flights f LEFT OUTER JOIN planes p
ON f.tailnum = p.tailnum
WHERE distance BETWEEN 200 AND 300
AND air_time IS NOT NULL
GROUP BY origin, dest
HAVING num_flts > 3000
ORDER BY num_seats DESC, avg_delay ASC
LIMIT 2;"
)
#> # A tibble: 2 × 5
#> origin dest num_flts num_seats avg_delay
#> <chr> <chr> <int> <dbl> <dbl>
#> 1 LGA DCA 4468 712643 6
#> 2 EWR BOS 5247 611192 5
Если в запросе вы используете всего одну таблицу, то можно передать её в качестве первого аргумента функции query(), и в тексте запроса опустить блок FROM.
airports %>%
query("SELECT name, lat, lon ORDER BY lat DESC LIMIT 5")
Пример трансляции SQL запроса в dplyr код с помощью show_dplyr():
show_dplyr(
" SELECT manufacturer,
COUNT(*) AS num_planes
FROM planes
WHERE engine = 'Turbo-fan'
GROUP BY manufacturer
ORDER BY num_planes DESC;"
)
#> planes %>%
#> filter(engine == "Turbo-fan") %>%
#> group_by(manufacturer) %>%
#> summarise(num_planes = dplyr::n()) %>%
#> ungroup() %>%
#> arrange(dplyr::desc(num_planes))
Ссылки:
- примеры кода взяты из README
#заметки_по_R