Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

3 года назад
Открыть в
Манипуляция данными с помощью 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