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

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

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

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

4 года назад
Открыть в
​​nplyr: Грамматика манипулирования вложенными данными Пакет nplyr по функционалу схож со всем известным dplyr, но выполняет манипуляцию над вложенными столбцами-списками, не требуя из предварительного разворачивания. По сути nplyr является обёрткой над dplyr и имеет схожие функции, в названее которых добавлен префикс nest_. Ниже перечислены некоторые эквиваленты функций nplyr и dplyr. ● nest_mutate() - mutate()nest_select() - select()nest_filter() - filter()nest_summarise() - summarise()nest_group_by() - group_by() На самом деле, в nplyr есть обёртки практически всех dplyr глаголов. Далее рассмотрим несколько примеров, для их демонстрации мы возьмём набор данных о странах на каждом континенте из пакета gapminder, и свернём этот набор данных по континентам, сами данные по странам закинем во вложенный столбец country_data.
 
library(nplyr)

gm_nest <- 
  gapminder::gapminder_unfiltered %>%
  tidyr::nest(country_data = -continent)

gm_nest
#> # A tibble: 6 × 2
#>   continent country_data        
#>   <fct>     <list>              
#> 1 Asia      <tibble [578 × 5]>  
#> 2 Europe    <tibble [1,302 × 5]>
#> 3 Africa    <tibble [637 × 5]>  
#> 4 Americas  <tibble [470 × 5]>  
#> 5 FSU       <tibble [139 × 5]>  
#> 6 Oceania   <tibble [187 × 5]>
Теперь с помощью nplyr мы можем производить манипуляции данными, не разворачивая столбец-список. В следующем примере мы получим данные о населении переведённые в миллионы человек, за максимальный год по каждой стране.
 
gm_nest %>%
  nest_filter(country_data, year == max(year)) %>%
  nest_mutate(country_data, pop_millions = pop/1000000) %>%
  slice_head(n = 1) %>%
  tidyr::unnest(country_data)
Последней операцией мы развернули столбец с вычислениями, для того, что бы убедиться в том, что столбец с численностью населения переведённый в миллионы был добавлен. Для того, что бы вам было более понятно, тоже самое можно было сделать на чистом tidyverse предварительно развернув вложенный столбец country_data.
 
gm_nest %>%
  tidyr::unnest(country_data) %>%
  group_by(continent) %>%
  filter(year == max(year)) %>%
  mutate(pop_millions = pop/1000000) %>%
  ungroup() %>%
  filter(continent == "Asia")
Также nplyr поддерживает операции по группировке и агрегации данных:
 
gm_nest %>%
  nest_group_by(country_data, year) %>%
  nest_summarise(
    country_data, 
    n = n(),
    lifeExp = median(lifeExp),
    pop = median(pop),
    gdpPercap = median(gdpPercap)
  )
Ссылки: - примеры кода заимствованы из README - ещё один интересный пример можно найти в виньетке "Use case for nplyr" #заметки_по_R