1 Гремучая смесь R и маркдаун

В нашем документе смешан код R внутри сереньких блоков и текст с разметкой маркдаун. Эту смесь можно превратить в готовый документ, нажав на клубок ниток со словом Knit прямо над документом.

Попробуйте кликнуть Knit:)

Будьте осторожны при редактировании R-маркдаун! Например, если Вовочка удалит один закрывающий разделитель, то компьютер будет воспринимать человеческий текст как команды R и выдаст ошибку.

Основные опции блоков кода: - message=TRUE/FALSE - выводить ли в отчёт сообщения - warning=TRUE/FALSE - выводить ли в отчёт предупреждения - echo=TRUE/FALSE - копировать ли в отчёт сами команды R - eval=TRUE/FALSE - выполнять ли команды внутри блока кода - “Самый важный шмат кода” - название блока кода :)

Подробнее про фантастические возможности R+маркдаун: Help - Cheatsheets - R markdown.

Сделайте свой Rstudio уютненьким: Tools - Global Options - Appearance :)

2 Работа с очень качественными переменными.

В R есть много типов переменных, например: - количественные (double, dbl) - целочисленные (integer, int) - дата и время (datetime, dttm) - логические (logical, lgl) - качественные/категориальные/факторные (factor, fctr) - текстовые (character, chr)

Существенной разницы между текстовыми и качественными нет. Отличия качественных от текстовых: - ограничено количество значений, скажем только “зима”, “весна”, “лето”, “осень” - можно задать порядок “магистр” > “бакалавр” > “школьник” - занимают меньше места в памяти

Подключаем нужные пакеты и вперёд!

## Warning: package 'tibble' was built under R version 3.4.3
## Warning: package 'forcats' was built under R version 3.4.3
## Warning: package 'vcd' was built under R version 3.4.3
## Warning: package 'skimr' was built under R version 3.4.4
## Warning: package 'rio' was built under R version 3.4.4
## Warning: package 'ggalluvial' was built under R version 3.4.3
## Warning: package 'reshape2' was built under R version 3.4.3

Узнаём частотность каждой категории переменной color:

table(diamonds$color)
## 
##     D     E     F     G     H     I     J 
##  6775  9797  9542 11292  8304  5422  2808

Или получаем список категорий без количеств:

levels(diamonds$color)
## [1] "D" "E" "F" "G" "H" "I" "J"

Попробуем объединить три категории в одну: “D”, “E”, “F” в “United”:

diamonds2 <- mutate(diamonds, color = fct_collapse(color, United = c('D', 'E', 'F')))
## Warning: package 'bindrcpp' was built under R version 3.4.4
table(diamonds2$color)
## 
## United      G      H      I      J 
##  26114  11292   8304   5422   2808

Объедините категории “Premium” и “Ideal” огранки cut в категорию ‘Best’. Обратите внимание на то, какие названия пишутся в кавычках.

diamonds3 <- mutate(diamonds, cut = fct_collapse(cut, Best = c('Premium', 'Ideal')))
table(diamonds3$cut)
## 
##      Fair      Good Very Good      Best 
##      1610      4906     12082     35342

3 Таблицы сопряжённости

Рассмотрим данные по зарплатам со страницы UCI. Загружаем и смотрим на них:

adult <- import('adult.rds') # загружаем данные
glimpse(adult)
## Observations: 32,561
## Variables: 15
## $ V1  <int> 39, 50, 38, 53, 28, 37, 49, 52, 31, 42, 37, 30, 23, 32, 40...
## $ V2  <fct> State-gov, Self-emp-not-inc, Private, Private, Private, Pr...
## $ V3  <int> 77516, 83311, 215646, 234721, 338409, 284582, 160187, 2096...
## $ V4  <fct> Bachelors, Bachelors, HS-grad, 11th, Bachelors, Masters, 9...
## $ V5  <int> 13, 13, 9, 7, 13, 14, 5, 9, 14, 13, 10, 13, 13, 12, 11, 4,...
## $ V6  <fct> Never-married, Married-civ-spouse, Divorced, Married-civ-s...
## $ V7  <fct> Adm-clerical, Exec-managerial, Handlers-cleaners, Handlers...
## $ V8  <fct> Not-in-family, Husband, Not-in-family, Husband, Wife, Wife...
## $ V9  <fct> White, White, White, Black, Black, White, Black, White, Wh...
## $ V10 <fct> Male, Male, Male, Male, Female, Female, Female, Male, Fema...
## $ V11 <int> 2174, 0, 0, 0, 0, 0, 0, 0, 14084, 5178, 0, 0, 0, 0, 0, 0, ...
## $ V12 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ V13 <int> 40, 13, 40, 40, 40, 40, 16, 45, 50, 40, 80, 40, 30, 50, 40...
## $ V14 <fct> United-States, United-States, United-States, United-States...
## $ V15 <fct> <=50K, <=50K, <=50K, <=50K, <=50K, <=50K, <=50K, >50K, >50...

Переменные в файле были без названий и потому R их сиротливо назвал V1, V2 :) Полное описание переменных UCI.

Мы обратим внимание на три переменных: V2 - сектор, V9 - расу и V15 - зарплату. Для удобства мы их отберём и переименуем:

adult2 <- select(adult, sector = V2, race = V10, wage = V15)
glimpse(adult2)
## Observations: 32,561
## Variables: 3
## $ sector <fct> State-gov, Self-emp-not-inc, Private, Private, Private,...
## $ race   <fct> Male, Male, Male, Male, Female, Female, Female, Male, F...
## $ wage   <fct> <=50K, <=50K, <=50K, <=50K, <=50K, <=50K, <=50K, >50K, ...
skim(adult2)
## Skim summary statistics
##  n obs: 32561 
##  n variables: 3 
## 
## Variable type: factor 
##  variable missing complete     n n_unique
##      race       0    32561 32561        2
##    sector       0    32561 32561        9
##      wage       0    32561 32561        2
##                                 top_counts ordered
##              Mal: 21790, Fem: 10771, NA: 0   FALSE
##  Pri: 22696, Sel: 2541, Loc: 2093, ?: 1836   FALSE
##               <=5: 24720, >50: 7841, NA: 0   FALSE

Для качественных переменных можно создавать таблицы сопряжённости. По строкам указываются значения одной переменной, по столбцам — другой, а на пересечении стоит количество наблюдений.

Таблицу сопряжённости можно создать командой table():

table(adult2$sector, adult2$wage)
##                   
##                    <=50K  >50K
##   ?                 1645   191
##   Federal-gov        589   371
##   Local-gov         1476   617
##   Never-worked         7     0
##   Private          17733  4963
##   Self-emp-inc       494   622
##   Self-emp-not-inc  1817   724
##   State-gov          945   353
##   Without-pay         14     0

Девять значений переменной sector- довольно много для ясной визуализации!

Но мы уже знаем, как объединять переменные, поэтому всех трудящихся на государство различать не будем. Также объединим в одну категорию предпринимателей, значения Self-emp-not-inc, Self-emp-inc.

adult3 <- mutate(adult2, sector = fct_collapse(sector, Gov = c('State-gov', 'Federal-gov', 'Local-gov')))
adult4 <- mutate(adult3, sector = fct_collapse(sector, Self_emp = c('Self-emp-not-inc', 'Self-emp-inc')))
skim(adult4)
## Skim summary statistics
##  n obs: 32561 
##  n variables: 3 
## 
## Variable type: factor 
##  variable missing complete     n n_unique
##      race       0    32561 32561        2
##    sector       0    32561 32561        6
##      wage       0    32561 32561        2
##                                 top_counts ordered
##              Mal: 21790, Fem: 10771, NA: 0   FALSE
##  Pri: 22696, Gov: 4351, Sel: 3657, ?: 1836   FALSE
##               <=5: 24720, >50: 7841, NA: 0   FALSE

Строим более компактную таблицу сопряжённости:

ctable <- table(adult4$sector, adult4$wage, dnn = c('Сектор', 'Зарплата'))
ctable
##               Зарплата
## Сектор   <=50K  >50K
##   ?             1645   191
##   Gov           3010  1341
##   Never-worked     7     0
##   Private      17733  4963
##   Self_emp      2311  1346
##   Without-pay     14     0

Визуализировать таблицу сопряжённости можно командой mosaic() из пакета vcd.

mosaic(ctable, shade = TRUE, legend = TRUE)

Внутри функции сидит сама таблицу сопряжённости и опции: - shade = TRUE, чтобы график был цветным; - legend = TRUE, чтобы появилась легенда.

Можно ли считать зарплату и сектор независимыми признаками? Ответ даёт хи-квадрат тест Пирсона на независимость, chisq.test().

chisq.test(ctable)
## Warning in chisq.test(ctable): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  ctable
## X-squared = 687.39, df = 5, p-value < 2.2e-16

Возьмём встроенный набор данных Arthritis о лечения артрита. - Посмотрите на описательные статистики. Сколько наблюдений в данных? - Сколько уникальных значений принимают факторные переменные? - Составьте таблицу сопряжённости для переменных Treatment и Improved. Укажите названия переменных. - Постройте мозаичный график mosaic() для таблицы сопряжённости. - Протестируйте независимость признаков Treatment и Improved используя оператор “затем”

dta <- Arthritis
skim(dta)
## Skim summary statistics
##  n obs: 84 
##  n variables: 5 
## 
## Variable type: factor 
##   variable missing complete  n n_unique                       top_counts
##   Improved       0       84 84        3 Non: 42, Mar: 28, Som: 14, NA: 0
##        Sex       0       84 84        2          Fem: 59, Mal: 25, NA: 0
##  Treatment       0       84 84        2          Pla: 43, Tre: 41, NA: 0
##  ordered
##     TRUE
##    FALSE
##    FALSE
## 
## Variable type: integer 
##  variable missing complete  n  mean    sd p0   p25  p50   p75 p100
##       Age       0       84 84 53.36 12.77 23 46    57   63      74
##        ID       0       84 84 42.5  24.39  1 21.75 42.5 63.25   84
##      hist
##  ▂▃▂▃▃▇▆▃
##  ▇▇▇▇▇▇▇▇
new_ctable <- table(dta$Treatment, dta$Improved, dnn = c('Лечение', 'Улучшение'))
new_ctable
##          Улучшение
## Лечение None Some Marked
##   Placebo   29    7      7
##   Treated   13    7     21
mosaic(new_ctable, shade = TRUE, legend = TRUE)

new_ctable %>% chisq.test() # применяем к таблице тест на независимость
## 
##  Pearson's Chi-squared test
## 
## data:  .
## X-squared = 13.055, df = 2, p-value = 0.001463

3.1 Очень много качественных переменных

Если качественных переменных больше двух, то разумнее посчитать таблицу частот. Мы группируем наблюдения по трём переменным и для каждой группы считаем количество наблюдений n().

freq_table <- group_by(adult4, wage, race, sector) %>% summarise(freq = n())
freq_table
## # A tibble: 20 x 4
## # Groups:   wage, race [?]
##    wage  race   sector        freq
##    <fct> <fct>  <fct>        <int>
##  1 <=50K Female ?              787
##  2 <=50K Female Gov           1361
##  3 <=50K Female Never-worked     2
##  4 <=50K Female Private       7026
##  5 <=50K Female Self_emp       411
##  6 <=50K Female Without-pay      5
##  7 <=50K Male   ?              858
##  8 <=50K Male   Gov           1649
##  9 <=50K Male   Never-worked     5
## 10 <=50K Male   Private      10707
## 11 <=50K Male   Self_emp      1900
## 12 <=50K Male   Without-pay      9
## 13 >50K  Female ?               52
## 14 >50K  Female Gov            278
## 15 >50K  Female Private        726
## 16 >50K  Female Self_emp       123
## 17 >50K  Male   ?              139
## 18 >50K  Male   Gov           1063
## 19 >50K  Male   Private       4237
## 20 >50K  Male   Self_emp      1223
  • Упражнение 4.

Опишите словами, что изображено на графике:

mosaic(data = Arthritis, ~ Sex + Treatment + Improved, shade = TRUE, legend = TRUE)

4 Корреляционная матрица

Возьмём встроенный набор данных про автомобили mtcars. Напоминалка: посмотреть описание данных можно, набрав в консоли ?mtcars.

Команда cor() поможет нам легко посчитать корреляции!

glimpse(mtcars)
## Observations: 32
## Variables: 11
## $ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19....
## $ 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, 1...
## $ 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.9...
## $ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3...
## $ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 2...
## $ 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, ...
cars_cor <- cor(mtcars)
cars_cor
##             mpg        cyl       disp         hp        drat         wt
## mpg   1.0000000 -0.8521620 -0.8475514 -0.7761684  0.68117191 -0.8676594
## cyl  -0.8521620  1.0000000  0.9020329  0.8324475 -0.69993811  0.7824958
## disp -0.8475514  0.9020329  1.0000000  0.7909486 -0.71021393  0.8879799
## hp   -0.7761684  0.8324475  0.7909486  1.0000000 -0.44875912  0.6587479
## drat  0.6811719 -0.6999381 -0.7102139 -0.4487591  1.00000000 -0.7124406
## wt   -0.8676594  0.7824958  0.8879799  0.6587479 -0.71244065  1.0000000
## qsec  0.4186840 -0.5912421 -0.4336979 -0.7082234  0.09120476 -0.1747159
## vs    0.6640389 -0.8108118 -0.7104159 -0.7230967  0.44027846 -0.5549157
## am    0.5998324 -0.5226070 -0.5912270 -0.2432043  0.71271113 -0.6924953
## gear  0.4802848 -0.4926866 -0.5555692 -0.1257043  0.69961013 -0.5832870
## carb -0.5509251  0.5269883  0.3949769  0.7498125 -0.09078980  0.4276059
##             qsec         vs          am       gear        carb
## mpg   0.41868403  0.6640389  0.59983243  0.4802848 -0.55092507
## cyl  -0.59124207 -0.8108118 -0.52260705 -0.4926866  0.52698829
## disp -0.43369788 -0.7104159 -0.59122704 -0.5555692  0.39497686
## hp   -0.70822339 -0.7230967 -0.24320426 -0.1257043  0.74981247
## drat  0.09120476  0.4402785  0.71271113  0.6996101 -0.09078980
## wt   -0.17471588 -0.5549157 -0.69249526 -0.5832870  0.42760594
## qsec  1.00000000  0.7445354 -0.22986086 -0.2126822 -0.65624923
## vs    0.74453544  1.0000000  0.16834512  0.2060233 -0.56960714
## am   -0.22986086  0.1683451  1.00000000  0.7940588  0.05753435
## gear -0.21268223  0.2060233  0.79405876  1.0000000  0.27407284
## carb -0.65624923 -0.5696071  0.05753435  0.2740728  1.00000000

Если вдруг нужна корреляция не Пирсона, а Кендалла или Спирмена, добавьте аргумент method = 'kendall' или method = 'spearman'.

Для визуализации корреляционной матрицы попробуем команду corrplot() из одноимённого пакета. Настраивать можно всё, что угодно, от формы кружочков до количества знаков после запятой.

Всего лишь несколько вариантов:

corrplot(cars_cor) # график с аргументами по умолчанию

corrplot(cars_cor, method = 'number') # график со значениями корреляции

corrplot(cars_cor, method = 'color', type = 'upper') # только правая верхняя часть

corrplot.mixed(cars_cor) # можно миксовать!

Красивые примеры из виньетки пакета. И менее красочная, но подробнейшая справка - ?corrplot.

Возьмём таблицу airquality, ежедневные измерения качества воздуха в Нью-Йорке в 1973 году. Подробности в справке :) - Сколько наблюдений и переменных в наборе данных airquality? Есть ли пропуски в данных? - Посчитайте корреляции, игнорируя пропущенные значения - Визуализируйте корреляции: значения должны быть только ниже диагонали, внутри графика должны стоять эллипсы. Вся необходимая информация есть в справке!

skim(airquality)
## Skim summary statistics
##  n obs: 153 
##  n variables: 6 
## 
## Variable type: integer 
##  variable missing complete   n   mean    sd p0    p25   p50    p75 p100
##       Day       0      153 153  15.8   8.86  1   8     16    23      31
##     Month       0      153 153   6.99  1.42  5   6      7     8       9
##     Ozone      37      116 153  42.13 32.99  1  18     31.5  63.25  168
##   Solar.R       7      146 153 185.93 90.06  7 115.75 205   258.75  334
##      Temp       0      153 153  77.88  9.47 56  72     79    85      97
##      hist
##  ▇▇▇▇▆▇▇▇
##  ▇▇▁▇▁▇▁▇
##  ▇▆▃▃▂▁▁▁
##  ▃▃▃▃▅▇▇▃
##  ▂▂▃▆▇▇▃▃
## 
## Variable type: numeric 
##  variable missing complete   n  mean   sd  p0 p25 p50  p75 p100     hist
##      Wind       0      153 153  9.96 3.52 1.7 7.4 9.7 11.5 20.7 ▁▃▇▇▅▅▁▁
cmatrix <- cor(airquality, use = 'pairwise.complete.obs') # игнорируем пропущенные значения
cmatrix
##               Ozone     Solar.R        Wind       Temp        Month
## Ozone    1.00000000  0.34834169 -0.60154653  0.6983603  0.164519314
## Solar.R  0.34834169  1.00000000 -0.05679167  0.2758403 -0.075300764
## Wind    -0.60154653 -0.05679167  1.00000000 -0.4579879 -0.178292579
## Temp     0.69836034  0.27584027 -0.45798788  1.0000000  0.420947252
## Month    0.16451931 -0.07530076 -0.17829258  0.4209473  1.000000000
## Day     -0.01322565 -0.15027498  0.02718090 -0.1305932 -0.007961763
##                  Day
## Ozone   -0.013225647
## Solar.R -0.150274979
## Wind     0.027180903
## Temp    -0.130593175
## Month   -0.007961763
## Day      1.000000000
corrplot(cmatrix, method = 'ellipse', type = 'upper')

5 Группировка данных

Иногда мы хотим сгруппировать наблюдения по нескольким переменным и для каждой группы что-то посчитать!

Посчитаем для каждого цвета бриллианта максимальную, минимальную цену!

report <- group_by(diamonds, color) %>%
  summarise(min_price = min(price), max_price = max(price))
report
## # A tibble: 7 x 3
##   color min_price max_price
##   <ord>     <dbl>     <dbl>
## 1 D           357     18693
## 2 E           326     18731
## 3 F           342     18791
## 4 G           354     18818
## 5 H           337     18803
## 6 I           334     18823
## 7 J           335     18710
report2 <- group_by(diamonds, cut) %>%
  summarise(med_price = median(price), sd_price = sd(price), n_obs = n()) %>%
  top_n(3, med_price)
report2
## # A tibble: 3 x 4
##   cut     med_price sd_price n_obs
##   <ord>       <dbl>    <dbl> <int>
## 1 Fair        3282     3560.  1610
## 2 Good        3050.    3682.  4906
## 3 Premium     3185     4349. 13791
report3 <- group_by(diamonds, clarity) %>%
  summarise(med_price = median(price), med_carat = median(carat), n_obs = n()) %>%
  arrange(med_carat)
report3
## # A tibble: 8 x 4
##   clarity med_price med_carat n_obs
##   <ord>       <dbl>     <dbl> <int>
## 1 IF           1080     0.35   1790
## 2 VVS1         1093     0.39   3655
## 3 VVS2         1311     0.44   5066
## 4 VS1          2005     0.570  8171
## 5 VS2          2054     0.63  12258
## 6 SI1          2822     0.76  13065
## 7 SI2          4072     1.01   9194
## 8 I1           3344     1.12    741

6 Грамматика графиков

Графиков в R много и разных. Мы сосредоточимся на грамматике графиков и пакете ggplot2.

Каждый график состоит из нескольких слоёв (layer). Даже самый простой график мы разложим на слои: точки и подписи осей.

У типичного слоя мы указываем: - откуда брать данные; - геометрию (geometry): точки на плоскости, скрипки, линия, столбцы гистограммы, куски карты, линии уровня и т.д. - как каждая переменная из набора данных превращается в эстетику.

Для простого графика это занудство, но для сложного это настоящее спасение! Попробуем быть занудами :)

Обычная диаграмма рассеяния!

ggplot(data = diamonds) +
  geom_point(aes(x = carat, y = price)) +
  labs(x = 'Масса в каратах', y = 'Цена в долларах', title = 'Бриллианты. Много :)')

Задействуем эстетику цвета!

ggplot(data = diamonds) +
  geom_point(aes(x = carat, y = price, color = color)) +
  labs(x = 'Масса в каратах', y = 'Цена в долларах', title = 'Бриллианты. Много :)')

Добавим новый слой вертикальных линий! Задействуем эстетику цвета!

ggplot(data = diamonds) +
  geom_point(aes(x = carat, y = price, color = color)) +
  geom_vline(aes(xintercept = mean(carat))) +
  labs(x = 'Масса в каратах', y = 'Цена в долларах', title = 'Бриллианты. Много :)')

Снова возьмём встроенные данные про машины mtcars.

Постройте диаграмму рассеяния сопоставив эстетики графика и переменные так: - координата x - пробег в милях на один галлон бензина mpg - координата y - объём двигателя disp - форма shape - наличие ручной коробки передач, переменная am

mtcars <- mutate(mtcars, am = factor(am))
ggplot(data = mtcars) +
  geom_point(aes(x = mpg, y = disp, shape = am)) +
  labs(x = 'Пробег в милях на галлон', y = 'Объём двигателя')

Добавьте к графику горизонтальную линию на уровне медианного объема двигателя

ggplot(data = mtcars) +
  geom_point(aes(x = mpg, y = disp, shape = am)) +
  geom_hline(aes(yintercept = median(disp)))

  labs(x = 'Пробег в милях на галлон', y = 'Объём двигателя')
## $x
## [1] "Пробег в милях на галлон"
## 
## $y
## [1] "Объём двигателя"
## 
## attr(,"class")
## [1] "labels"

Нарисуйте гистограмму пробега на одну милю mpg:

ggplot(data = mtcars) +
  geom_histogram(aes(x = mpg)) +
  labs(x = 'Пробег в милях на галлон', title = 'Няшный график :)')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Очень подробная документация по ggplot.

Глава про графики в R for data science.

7 Графики для качественных переменных

Количество цилиндров cyl принимает слишком мало значений, поэтому определим cyl как факторную переменную. Это действие влияет на то, как строятся графики!

mtcars2 <- mutate(mtcars, cyl = factor(cyl))

Посмотрим на распределение расхода бензина на милю (mpg) в зависимости от количества цилиндров.

Вместо устаревшего графика “ларь-да-усы” будем строить скрипичный график (violin plot) командой geom_viloin() из пакета ggplot2.

ggplot(data = mtcars, aes(x = cyl, y = mpg)) +
  geom_violin() +
  labs(x = 'Цилиндры', y = 'Мощность', title = 'Машины')

С помощью функции facet_grid() можно разбить график на две панели: для ручной и автоматической коробки передач, am.

ggplot(data = mtcars2) +
  geom_violin(aes(x = cyl, y = mpg)) +
  facet_grid(am ~ .) +
  labs(x = 'Цилиндры', y = 'Мощность', title = 'Машины')

Добавить новый шмат кода можно через меню Code - Insert chunk.

7.1 Потоковый график

И для примера более сложный график с кучей слоёв!

Вспомним старую таблицу частот:

freq_table
## # A tibble: 20 x 4
## # Groups:   wage, race [?]
##    wage  race   sector        freq
##    <fct> <fct>  <fct>        <int>
##  1 <=50K Female ?              787
##  2 <=50K Female Gov           1361
##  3 <=50K Female Never-worked     2
##  4 <=50K Female Private       7026
##  5 <=50K Female Self_emp       411
##  6 <=50K Female Without-pay      5
##  7 <=50K Male   ?              858
##  8 <=50K Male   Gov           1649
##  9 <=50K Male   Never-worked     5
## 10 <=50K Male   Private      10707
## 11 <=50K Male   Self_emp      1900
## 12 <=50K Male   Without-pay      9
## 13 >50K  Female ?               52
## 14 >50K  Female Gov            278
## 15 >50K  Female Private        726
## 16 >50K  Female Self_emp       123
## 17 >50K  Male   ?              139
## 18 >50K  Male   Gov           1063
## 19 >50K  Male   Private       4237
## 20 >50K  Male   Self_emp      1223

Нарисуем две вариации потокового графика с помощью пакета ggalluvial

ggplot(data = freq_table,
       aes(weight = freq, axis1 = sector, axis2 = wage)) +
  geom_alluvium(aes(fill = race), width = 1/12) +
  geom_stratum(width = 1/8) +
  geom_label(stat = "stratum", label.strata = TRUE)
## Missing alluvia for some stratum combinations.
## Missing alluvia for some stratum combinations.
## Missing alluvia for some stratum combinations.

ggplot(data = freq_table,
         aes(weight = freq, axis1 = sector, axis2 = wage, axis3 = race)) +
    geom_alluvium(aes(fill = race), width = 1/12) +
    geom_stratum(width = 1/8) +
    geom_label(stat = "stratum", label.strata = TRUE)
## Missing alluvia for some stratum combinations.
## Missing alluvia for some stratum combinations.
## Missing alluvia for some stratum combinations.

  • Упражнение 11.

  • Какой элемент графика рисует геометрия geom_stratum, а какой - геометрия geom_alluvium?

Подсказка: просто удалите по очереди каждую из этих строк, и посмотрите, что исчезает!

Вдохновиться примерами и нарисовать себе “такой же, но с перламутровыми пуговицами” потоковый график

8 Соединение таблиц

Таблицы можно создавать и самим c помощью функции tibble().

mx <- tibble(ID = c('A', 'B', 'C', 'D', 'E'),
           x = c(1, 2, 4, 1, 8))
mx
## # A tibble: 5 x 2
##   ID        x
##   <chr> <dbl>
## 1 A         1
## 2 B         2
## 3 C         4
## 4 D         1
## 5 E         8

Создайте таблицу my, с двумя столбцами: ID и y, и пятью значениями в каждом. Столбец y можно заполнить числами произвольно.

my <- tibble(ID = c('A', 'C', 'D', 'F', 'E'),
             y = c(1, 2, 6, 7, -9))
my
## # A tibble: 5 x 2
##   ID        y
##   <chr> <dbl>
## 1 A         1
## 2 C         2
## 3 D         6
## 4 F         7
## 5 E        -9

Таблицы можно соединять! Существует четыре способа сделать это: - left_join(x, y, by = 'colname') сохраняет все наблюдения в таблице x - right_join(x, y, by = 'colname') сохраняет все наблюдения в таблице y - full_join(x, y, by = 'colname') сохраняет наблюдения из обеих таблиц - inner_join(x, y, by = 'colname') объединяет только те строки обеих таблиц, в которых нет пропущенных наблюдений

Экспериментируем!

left_join(mx, my, by = 'ID')
## # A tibble: 5 x 3
##   ID        x     y
##   <chr> <dbl> <dbl>
## 1 A         1     1
## 2 B         2    NA
## 3 C         4     2
## 4 D         1     6
## 5 E         8    -9
right_join(mx, my, by = 'ID')
## # A tibble: 5 x 3
##   ID        x     y
##   <chr> <dbl> <dbl>
## 1 A         1     1
## 2 C         4     2
## 3 D         1     6
## 4 F        NA     7
## 5 E         8    -9
inner_join(mx, my, by = 'ID')
## # A tibble: 4 x 3
##   ID        x     y
##   <chr> <dbl> <dbl>
## 1 A         1     1
## 2 C         4     2
## 3 D         1     6
## 4 E         8    -9
full_join(mx, my, by = 'ID')
## # A tibble: 6 x 3
##   ID        x     y
##   <chr> <dbl> <dbl>
## 1 A         1     1
## 2 B         2    NA
## 3 C         4     2
## 4 D         1     6
## 5 E         8    -9
## 6 F        NA     7

Нужно объединить таблицы flights и weather о вылетах из Нью-Йорка сразу по нескольким столбцам!

glimpse(flights)
## Observations: 336,776
## Variables: 19
## Warning in as.POSIXlt.POSIXct(x, tz): unknown timezone 'zone/tz/2018c.1.0/
## zoneinfo/Europe/Moscow'
## $ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,...
## $ month          <int> 1, 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, 1,...
## $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 55...
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 60...
## $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2...
## $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 7...
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 7...
## $ 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, 79...
## $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN...
## $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR"...
## $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL"...
## $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138...
## $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 94...
## $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,...
## $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013...
glimpse(weather)
## Observations: 26,130
## Variables: 15
## $ origin     <chr> "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "E...
## $ year       <dbl> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 201...
## $ month      <dbl> 1, 1, 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, 1, 1, ...
## $ hour       <int> 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...
## $ temp       <dbl> 37.04, 37.04, 37.94, 37.94, 37.94, 39.02, 39.02, 39...
## $ dewp       <dbl> 21.92, 21.92, 21.92, 23.00, 24.08, 26.06, 26.96, 28...
## $ humid      <dbl> 53.97, 53.97, 52.09, 54.51, 57.04, 59.37, 61.63, 64...
## $ wind_dir   <dbl> 230, 230, 230, 230, 240, 270, 250, 240, 250, 260, 2...
## $ wind_speed <dbl> 10.35702, 13.80936, 12.65858, 13.80936, 14.96014, 1...
## $ wind_gust  <dbl> 11.918651, 15.891535, 14.567241, 15.891535, 17.2158...
## $ precip     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ pressure   <dbl> 1013.9, 1013.0, 1012.6, 1012.7, 1012.8, 1012.0, 101...
## $ visib      <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,...
## $ time_hour  <dttm> 2013-01-01 00:00:00, 2013-01-01 01:00:00, 2013-01-...
left <- left_join(flights, weather, by = c('year', 'month', 'day', 'hour', 'origin'))
glimpse(left)
## Observations: 336,776
## Variables: 29
## $ year           <dbl> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,...
## $ month          <dbl> 1, 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, 1,...
## $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 55...
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 60...
## $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2...
## $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 7...
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 7...
## $ 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, 79...
## $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN...
## $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR"...
## $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL"...
## $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138...
## $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 94...
## $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,...
## $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ time_hour.x    <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013...
## $ temp           <dbl> NA, NA, NA, NA, 39.92, NA, 39.02, 39.92, 39.02,...
## $ dewp           <dbl> NA, NA, NA, NA, 26.06, NA, 26.06, 26.06, 26.06,...
## $ humid          <dbl> NA, NA, NA, NA, 57.33, NA, 59.37, 57.33, 59.37,...
## $ wind_dir       <dbl> NA, NA, NA, NA, 260, NA, 270, 260, 260, 260, 26...
## $ wind_speed     <dbl> NA, NA, NA, NA, 13.80936, NA, 10.35702, 13.8093...
## $ wind_gust      <dbl> NA, NA, NA, NA, 15.89154, NA, 11.91865, 15.8915...
## $ precip         <dbl> NA, NA, NA, NA, 0, NA, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ pressure       <dbl> NA, NA, NA, NA, 1011.9, NA, 1012.0, 1011.9, 101...
## $ visib          <dbl> NA, NA, NA, NA, 10, NA, 10, 10, 10, 10, 10, 10,...
## $ time_hour.y    <dttm> NA, NA, NA, NA, 2013-01-01 06:00:00, NA, 2013-...
inner <- inner_join(flights, weather, by =  c('year', 'month', 'day', 'hour', 'origin'))
glimpse(inner)
## Observations: 335,563
## Variables: 29
## $ year           <dbl> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,...
## $ month          <dbl> 1, 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, 1,...
## $ dep_time       <int> 554, 555, 557, 557, 558, 558, 558, 558, 558, 55...
## $ sched_dep_time <int> 600, 600, 600, 600, 600, 600, 600, 600, 600, 60...
## $ dep_delay      <dbl> -6, -5, -3, -3, -2, -2, -2, -2, -2, -1, -1, 0, ...
## $ arr_time       <int> 812, 913, 709, 838, 753, 849, 853, 924, 923, 94...
## $ sched_arr_time <int> 837, 854, 723, 846, 745, 851, 856, 917, 937, 91...
## $ arr_delay      <dbl> -25, 19, -14, -8, 8, -2, -3, 7, -14, 31, -8, -7...
## $ carrier        <chr> "DL", "B6", "EV", "B6", "AA", "B6", "B6", "UA",...
## $ flight         <int> 461, 507, 5708, 79, 301, 49, 71, 194, 1124, 707...
## $ tailnum        <chr> "N668DN", "N516JB", "N829AS", "N593JB", "N3ALAA...
## $ origin         <chr> "LGA", "EWR", "LGA", "JFK", "LGA", "JFK", "JFK"...
## $ dest           <chr> "ATL", "FLL", "IAD", "MCO", "ORD", "PBI", "TPA"...
## $ air_time       <dbl> 116, 158, 53, 140, 138, 149, 158, 345, 361, 257...
## $ distance       <dbl> 762, 1065, 229, 944, 733, 1028, 1005, 2475, 256...
## $ hour           <dbl> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,...
## $ minute         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5...
## $ time_hour.x    <dttm> 2013-01-01 06:00:00, 2013-01-01 06:00:00, 2013...
## $ temp           <dbl> 39.92, 39.02, 39.92, 39.02, 39.92, 39.02, 39.02...
## $ dewp           <dbl> 26.06, 26.06, 26.06, 26.06, 26.06, 26.06, 26.06...
## $ humid          <dbl> 57.33, 59.37, 57.33, 59.37, 57.33, 59.37, 59.37...
## $ wind_dir       <dbl> 260, 270, 260, 260, 260, 260, 260, 260, 270, 26...
## $ wind_speed     <dbl> 13.80936, 10.35702, 13.80936, 12.65858, 13.8093...
## $ wind_gust      <dbl> 15.89154, 11.91865, 15.89154, 14.56724, 15.8915...
## $ precip         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ pressure       <dbl> 1011.9, 1012.0, 1011.9, 1012.6, 1011.9, 1012.6,...
## $ visib          <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,...
## $ time_hour.y    <dttm> 2013-01-01 06:00:00, 2013-01-01 06:00:00, 2013...

9 Длинные и широкие таблицы

Таблицы бывают длинными и широкими! При поступлении нового наблюдения длинная растёт в длину, а широкая может и в ширину :)

Возьмём квартальные данные Росстата о ВВП по источникам доходов.

gdp <- import('gdp.xls')
glimpse(gdp)
## Observations: 4
## Variables: 29
## $ X__1             <chr> "Валовой внутренний продукт", "оплата труда н...
## $ `1 квартал 2011` <dbl> 13028.844, 6055.775, 1807.421, 5165.648
## $ `2 квартал 2011` <dbl> 14481.142, 6469.798, 2205.521, 5805.824
## $ `3 квартал 2011` <dbl> 15805.582, 6678.376, 2280.732, 6846.474
## $ `4 квартал 2011` <dbl> 16966.973, 7182.727, 2453.331, 7330.951
## $ `1 квартал 2012` <dbl> 15182.987, 6991.065, 2194.436, 5997.486
## $ `2 квартал 2012` <dbl> 16472.215, 7448.678, 2582.311, 6441.226
## $ `3 квартал 2012` <dbl> 17733.545, 7615.371, 2423.306, 7694.848
## $ `4 квартал 2012` <dbl> 18775.136, 8146.048, 2630.635, 7998.463
## $ `1 квартал 2013` <dbl> 16375.261, 7828.690, 2335.080, 6211.491
## $ `2 квартал 2013` <dbl> 17538.839, 8350.152, 2572.417, 6616.269
## $ `3 квартал 2013` <dbl> 19058.114, 8569.038, 2522.510, 7966.566
## $ `4 квартал 2013` <dbl> 20161.681, 9044.402, 2632.313, 8484.967
## $ `1 квартал 2014` <dbl> 17390.202, 8637.304, 2497.615, 6255.283
## $ `2 квартал 2014` <dbl> 19127.958, 9261.309, 2879.702, 6986.947
## $ `3 квартал 2014` <dbl> 20758.591, 9463.617, 2712.466, 8582.508
## $ `4 квартал 2014` <dbl> 21922.908, 10024.947, 2914.458, 8983.503
## $ `1 квартал 2015` <dbl> 18579.1, 9102.5, 2416.8, 7059.8
## $ `2 квартал 2015` <dbl> 19865.7, 9689.5, 2163.7, 8012.5
## $ `3 квартал 2015` <dbl> 22017.6, 9877.0, 2397.9, 9742.7
## $ `4 квартал 2015` <dbl> 22924.8, 10440.8, 2292.1, 10191.9
## $ `1 квартал 2016` <dbl> 19110.1, 9543.9, 2243.0, 7323.2
## $ `2 квартал 2016` <dbl> 20624.9, 10224.9, 2208.8, 8191.2
## $ `3 квартал 2016` <dbl> 22515.8, 10422.7, 2403.1, 9690.0
## $ `4 квартал 2016` <dbl> 23897.8, 11085.0, 2566.0, 10246.8
## $ `1 квартал 2017` <dbl> 20549.8, 10288.2, 2254.7, 8006.9
## $ `2 квартал 2017` <dbl> 22035.1, 11012.3, 2393.0, 8629.8
## $ `3 квартал 2017` <dbl> 23948.9, 11147.0, 2519.2, 10282.7
## $ `4 квартал 2017` <dbl> 25503.4, 11815.7, 2787.9, 10899.8
gdp
##                                                                                                                         X__1
## 1                                                                                                 Валовой внутренний продукт
## 2 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 3                                                                                     чистые налоги на производство и импорт
## 4                                                                       валовая прибыль экономики и валовые смешанные доходы
##   1 квартал 2011 2 квартал 2011 3 квартал 2011 4 квартал 2011
## 1      13028.844      14481.142      15805.582      16966.973
## 2       6055.775       6469.798       6678.376       7182.727
## 3       1807.421       2205.521       2280.732       2453.331
## 4       5165.648       5805.824       6846.474       7330.951
##   1 квартал 2012 2 квартал 2012 3 квартал 2012 4 квартал 2012
## 1      15182.987      16472.215      17733.545      18775.136
## 2       6991.065       7448.678       7615.371       8146.048
## 3       2194.436       2582.311       2423.306       2630.635
## 4       5997.486       6441.226       7694.848       7998.463
##   1 квартал 2013 2 квартал 2013 3 квартал 2013 4 квартал 2013
## 1      16375.261      17538.839      19058.114      20161.681
## 2       7828.690       8350.152       8569.038       9044.402
## 3       2335.080       2572.417       2522.510       2632.313
## 4       6211.491       6616.269       7966.566       8484.967
##   1 квартал 2014 2 квартал 2014 3 квартал 2014 4 квартал 2014
## 1      17390.202      19127.958      20758.591      21922.908
## 2       8637.304       9261.309       9463.617      10024.947
## 3       2497.615       2879.702       2712.466       2914.458
## 4       6255.283       6986.947       8582.508       8983.503
##   1 квартал 2015 2 квартал 2015 3 квартал 2015 4 квартал 2015
## 1        18579.1        19865.7        22017.6        22924.8
## 2         9102.5         9689.5         9877.0        10440.8
## 3         2416.8         2163.7         2397.9         2292.1
## 4         7059.8         8012.5         9742.7        10191.9
##   1 квартал 2016 2 квартал 2016 3 квартал 2016 4 квартал 2016
## 1        19110.1        20624.9        22515.8        23897.8
## 2         9543.9        10224.9        10422.7        11085.0
## 3         2243.0         2208.8         2403.1         2566.0
## 4         7323.2         8191.2         9690.0        10246.8
##   1 квартал 2017 2 квартал 2017 3 квартал 2017 4 квартал 2017
## 1        20549.8        22035.1        23948.9        25503.4
## 2        10288.2        11012.3        11147.0        11815.7
## 3         2254.7         2393.0         2519.2         2787.9
## 4         8006.9         8629.8        10282.7        10899.8

Обнаружив неудачное название переменной переименуем её сразу!

gdp <- rename(gdp, indicator = X__1)

Чтобы превратить широкую таблицу в длинную, нужна функция melt() из пакета reshape2.

Столбцы растают и стекут в новую переменную year. Если столбец нужно сохранить, то его надо перечислить в списке id.

long_gdp <- melt(gdp, id = 'indicator', variable.name = 'year')
head(long_gdp, 30) # первые 30 наблюдений
##                                                                                                                     indicator
## 1                                                                                                  Валовой внутренний продукт
## 2  оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 3                                                                                      чистые налоги на производство и импорт
## 4                                                                        валовая прибыль экономики и валовые смешанные доходы
## 5                                                                                                  Валовой внутренний продукт
## 6  оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 7                                                                                      чистые налоги на производство и импорт
## 8                                                                        валовая прибыль экономики и валовые смешанные доходы
## 9                                                                                                  Валовой внутренний продукт
## 10 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 11                                                                                     чистые налоги на производство и импорт
## 12                                                                       валовая прибыль экономики и валовые смешанные доходы
## 13                                                                                                 Валовой внутренний продукт
## 14 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 15                                                                                     чистые налоги на производство и импорт
## 16                                                                       валовая прибыль экономики и валовые смешанные доходы
## 17                                                                                                 Валовой внутренний продукт
## 18 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 19                                                                                     чистые налоги на производство и импорт
## 20                                                                       валовая прибыль экономики и валовые смешанные доходы
## 21                                                                                                 Валовой внутренний продукт
## 22 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 23                                                                                     чистые налоги на производство и импорт
## 24                                                                       валовая прибыль экономики и валовые смешанные доходы
## 25                                                                                                 Валовой внутренний продукт
## 26 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
## 27                                                                                     чистые налоги на производство и импорт
## 28                                                                       валовая прибыль экономики и валовые смешанные доходы
## 29                                                                                                 Валовой внутренний продукт
## 30 оплата труда наемных работников (включая оплату труда и смешанные доходы, не наблюдаемые прямыми статистическими методами)
##              year     value
## 1  1 квартал 2011 13028.844
## 2  1 квартал 2011  6055.775
## 3  1 квартал 2011  1807.421
## 4  1 квартал 2011  5165.648
## 5  2 квартал 2011 14481.142
## 6  2 квартал 2011  6469.798
## 7  2 квартал 2011  2205.521
## 8  2 квартал 2011  5805.824
## 9  3 квартал 2011 15805.582
## 10 3 квартал 2011  6678.376
## 11 3 квартал 2011  2280.732
## 12 3 квартал 2011  6846.474
## 13 4 квартал 2011 16966.973
## 14 4 квартал 2011  7182.727
## 15 4 квартал 2011  2453.331
## 16 4 квартал 2011  7330.951
## 17 1 квартал 2012 15182.987
## 18 1 квартал 2012  6991.065
## 19 1 квартал 2012  2194.436
## 20 1 квартал 2012  5997.486
## 21 2 квартал 2012 16472.215
## 22 2 квартал 2012  7448.678
## 23 2 квартал 2012  2582.311
## 24 2 квартал 2012  6441.226
## 25 3 квартал 2012 17733.545
## 26 3 квартал 2012  7615.371
## 27 3 квартал 2012  2423.306
## 28 3 квартал 2012  7694.848
## 29 4 квартал 2012 18775.136
## 30 4 квартал 2012  8146.048

Чтобы сделать обратное — перевести длинную таблицу в широкую — понадобится функция dcast().

Здесь тупому компьютеру умный Homo Sapiens укажет: - какая переменная пойдёт по строкам новой таблицы: cut - какая переменная пойдёт по столбцам новой таблицы: color - какая переменная пойдёт внутрь таблицы: price - как реагировать компьютеру, если окажется в данных несколько кандидатов в одну ячейку таблицы: взять mean

dcast(diamonds, cut ~ color, value.var = "price", fun.aggregate = mean)
##         cut        D        E        F        G        H        I        J
## 1      Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
## 2      Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
## 3 Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
## 4   Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
## 5     Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186

Из данных про воздух в Нью-Йорке airquality сделайте длинную таблицу. В качестве идентификаторов возьмите переменные Month и Day.

air_long <- melt(airquality, id = c('Month', 'Day')) # id оставлеет указанные столбцы
air_long
##     Month Day variable value
## 1       5   1    Ozone  41.0
## 2       5   2    Ozone  36.0
## 3       5   3    Ozone  12.0
## 4       5   4    Ozone  18.0
## 5       5   5    Ozone    NA
## 6       5   6    Ozone  28.0
## 7       5   7    Ozone  23.0
## 8       5   8    Ozone  19.0
## 9       5   9    Ozone   8.0
## 10      5  10    Ozone    NA
## 11      5  11    Ozone   7.0
## 12      5  12    Ozone  16.0
## 13      5  13    Ozone  11.0
## 14      5  14    Ozone  14.0
## 15      5  15    Ozone  18.0
## 16      5  16    Ozone  14.0
## 17      5  17    Ozone  34.0
## 18      5  18    Ozone   6.0
## 19      5  19    Ozone  30.0
## 20      5  20    Ozone  11.0
## 21      5  21    Ozone   1.0
## 22      5  22    Ozone  11.0
## 23      5  23    Ozone   4.0
## 24      5  24    Ozone  32.0
## 25      5  25    Ozone    NA
## 26      5  26    Ozone    NA
## 27      5  27    Ozone    NA
## 28      5  28    Ozone  23.0
## 29      5  29    Ozone  45.0
## 30      5  30    Ozone 115.0
## 31      5  31    Ozone  37.0
## 32      6   1    Ozone    NA
## 33      6   2    Ozone    NA
## 34      6   3    Ozone    NA
## 35      6   4    Ozone    NA
## 36      6   5    Ozone    NA
## 37      6   6    Ozone    NA
## 38      6   7    Ozone  29.0
## 39      6   8    Ozone    NA
## 40      6   9    Ozone  71.0
## 41      6  10    Ozone  39.0
## 42      6  11    Ozone    NA
## 43      6  12    Ozone    NA
## 44      6  13    Ozone  23.0
## 45      6  14    Ozone    NA
## 46      6  15    Ozone    NA
## 47      6  16    Ozone  21.0
## 48      6  17    Ozone  37.0
## 49      6  18    Ozone  20.0
## 50      6  19    Ozone  12.0
## 51      6  20    Ozone  13.0
## 52      6  21    Ozone    NA
## 53      6  22    Ozone    NA
## 54      6  23    Ozone    NA
## 55      6  24    Ozone    NA
## 56      6  25    Ozone    NA
## 57      6  26    Ozone    NA
## 58      6  27    Ozone    NA
## 59      6  28    Ozone    NA
## 60      6  29    Ozone    NA
## 61      6  30    Ozone    NA
## 62      7   1    Ozone 135.0
## 63      7   2    Ozone  49.0
## 64      7   3    Ozone  32.0
## 65      7   4    Ozone    NA
## 66      7   5    Ozone  64.0
## 67      7   6    Ozone  40.0
## 68      7   7    Ozone  77.0
## 69      7   8    Ozone  97.0
## 70      7   9    Ozone  97.0
## 71      7  10    Ozone  85.0
## 72      7  11    Ozone    NA
## 73      7  12    Ozone  10.0
## 74      7  13    Ozone  27.0
## 75      7  14    Ozone    NA
## 76      7  15    Ozone   7.0
## 77      7  16    Ozone  48.0
## 78      7  17    Ozone  35.0
## 79      7  18    Ozone  61.0
## 80      7  19    Ozone  79.0
## 81      7  20    Ozone  63.0
## 82      7  21    Ozone  16.0
## 83      7  22    Ozone    NA
## 84      7  23    Ozone    NA
## 85      7  24    Ozone  80.0
## 86      7  25    Ozone 108.0
## 87      7  26    Ozone  20.0
## 88      7  27    Ozone  52.0
## 89      7  28    Ozone  82.0
## 90      7  29    Ozone  50.0
## 91      7  30    Ozone  64.0
## 92      7  31    Ozone  59.0
## 93      8   1    Ozone  39.0
## 94      8   2    Ozone   9.0
## 95      8   3    Ozone  16.0
## 96      8   4    Ozone  78.0
## 97      8   5    Ozone  35.0
## 98      8   6    Ozone  66.0
## 99      8   7    Ozone 122.0
## 100     8   8    Ozone  89.0
## 101     8   9    Ozone 110.0
## 102     8  10    Ozone    NA
## 103     8  11    Ozone    NA
## 104     8  12    Ozone  44.0
## 105     8  13    Ozone  28.0
## 106     8  14    Ozone  65.0
## 107     8  15    Ozone    NA
## 108     8  16    Ozone  22.0
## 109     8  17    Ozone  59.0
## 110     8  18    Ozone  23.0
## 111     8  19    Ozone  31.0
## 112     8  20    Ozone  44.0
## 113     8  21    Ozone  21.0
## 114     8  22    Ozone   9.0
## 115     8  23    Ozone    NA
## 116     8  24    Ozone  45.0
## 117     8  25    Ozone 168.0
## 118     8  26    Ozone  73.0
## 119     8  27    Ozone    NA
## 120     8  28    Ozone  76.0
## 121     8  29    Ozone 118.0
## 122     8  30    Ozone  84.0
## 123     8  31    Ozone  85.0
## 124     9   1    Ozone  96.0
## 125     9   2    Ozone  78.0
## 126     9   3    Ozone  73.0
## 127     9   4    Ozone  91.0
## 128     9   5    Ozone  47.0
## 129     9   6    Ozone  32.0
## 130     9   7    Ozone  20.0
## 131     9   8    Ozone  23.0
## 132     9   9    Ozone  21.0
## 133     9  10    Ozone  24.0
## 134     9  11    Ozone  44.0
## 135     9  12    Ozone  21.0
## 136     9  13    Ozone  28.0
## 137     9  14    Ozone   9.0
## 138     9  15    Ozone  13.0
## 139     9  16    Ozone  46.0
## 140     9  17    Ozone  18.0
## 141     9  18    Ozone  13.0
## 142     9  19    Ozone  24.0
## 143     9  20    Ozone  16.0
## 144     9  21    Ozone  13.0
## 145     9  22    Ozone  23.0
## 146     9  23    Ozone  36.0
## 147     9  24    Ozone   7.0
## 148     9  25    Ozone  14.0
## 149     9  26    Ozone  30.0
## 150     9  27    Ozone    NA
## 151     9  28    Ozone  14.0
## 152     9  29    Ozone  18.0
## 153     9  30    Ozone  20.0
## 154     5   1  Solar.R 190.0
## 155     5   2  Solar.R 118.0
## 156     5   3  Solar.R 149.0
## 157     5   4  Solar.R 313.0
## 158     5   5  Solar.R    NA
## 159     5   6  Solar.R    NA
## 160     5   7  Solar.R 299.0
## 161     5   8  Solar.R  99.0
## 162     5   9  Solar.R  19.0
## 163     5  10  Solar.R 194.0
## 164     5  11  Solar.R    NA
## 165     5  12  Solar.R 256.0
## 166     5  13  Solar.R 290.0
## 167     5  14  Solar.R 274.0
## 168     5  15  Solar.R  65.0
## 169     5  16  Solar.R 334.0
## 170     5  17  Solar.R 307.0
## 171     5  18  Solar.R  78.0
## 172     5  19  Solar.R 322.0
## 173     5  20  Solar.R  44.0
## 174     5  21  Solar.R   8.0
## 175     5  22  Solar.R 320.0
## 176     5  23  Solar.R  25.0
## 177     5  24  Solar.R  92.0
## 178     5  25  Solar.R  66.0
## 179     5  26  Solar.R 266.0
## 180     5  27  Solar.R    NA
## 181     5  28  Solar.R  13.0
## 182     5  29  Solar.R 252.0
## 183     5  30  Solar.R 223.0
## 184     5  31  Solar.R 279.0
## 185     6   1  Solar.R 286.0
## 186     6   2  Solar.R 287.0
## 187     6   3  Solar.R 242.0
## 188     6   4  Solar.R 186.0
## 189     6   5  Solar.R 220.0
## 190     6   6  Solar.R 264.0
## 191     6   7  Solar.R 127.0
## 192     6   8  Solar.R 273.0
## 193     6   9  Solar.R 291.0
## 194     6  10  Solar.R 323.0
## 195     6  11  Solar.R 259.0
## 196     6  12  Solar.R 250.0
## 197     6  13  Solar.R 148.0
## 198     6  14  Solar.R 332.0
## 199     6  15  Solar.R 322.0
## 200     6  16  Solar.R 191.0
## 201     6  17  Solar.R 284.0
## 202     6  18  Solar.R  37.0
## 203     6  19  Solar.R 120.0
## 204     6  20  Solar.R 137.0
## 205     6  21  Solar.R 150.0
## 206     6  22  Solar.R  59.0
## 207     6  23  Solar.R  91.0
## 208     6  24  Solar.R 250.0
## 209     6  25  Solar.R 135.0
## 210     6  26  Solar.R 127.0
## 211     6  27  Solar.R  47.0
## 212     6  28  Solar.R  98.0
## 213     6  29  Solar.R  31.0
## 214     6  30  Solar.R 138.0
## 215     7   1  Solar.R 269.0
## 216     7   2  Solar.R 248.0
## 217     7   3  Solar.R 236.0
## 218     7   4  Solar.R 101.0
## 219     7   5  Solar.R 175.0
## 220     7   6  Solar.R 314.0
## 221     7   7  Solar.R 276.0
## 222     7   8  Solar.R 267.0
## 223     7   9  Solar.R 272.0
## 224     7  10  Solar.R 175.0
## 225     7  11  Solar.R 139.0
## 226     7  12  Solar.R 264.0
## 227     7  13  Solar.R 175.0
## 228     7  14  Solar.R 291.0
## 229     7  15  Solar.R  48.0
## 230     7  16  Solar.R 260.0
## 231     7  17  Solar.R 274.0
## 232     7  18  Solar.R 285.0
## 233     7  19  Solar.R 187.0
## 234     7  20  Solar.R 220.0
## 235     7  21  Solar.R   7.0
## 236     7  22  Solar.R 258.0
## 237     7  23  Solar.R 295.0
## 238     7  24  Solar.R 294.0
## 239     7  25  Solar.R 223.0
## 240     7  26  Solar.R  81.0
## 241     7  27  Solar.R  82.0
## 242     7  28  Solar.R 213.0
## 243     7  29  Solar.R 275.0
## 244     7  30  Solar.R 253.0
## 245     7  31  Solar.R 254.0
## 246     8   1  Solar.R  83.0
## 247     8   2  Solar.R  24.0
## 248     8   3  Solar.R  77.0
## 249     8   4  Solar.R    NA
## 250     8   5  Solar.R    NA
## 251     8   6  Solar.R    NA
## 252     8   7  Solar.R 255.0
## 253     8   8  Solar.R 229.0
## 254     8   9  Solar.R 207.0
## 255     8  10  Solar.R 222.0
## 256     8  11  Solar.R 137.0
## 257     8  12  Solar.R 192.0
## 258     8  13  Solar.R 273.0
## 259     8  14  Solar.R 157.0
## 260     8  15  Solar.R  64.0
## 261     8  16  Solar.R  71.0
## 262     8  17  Solar.R  51.0
## 263     8  18  Solar.R 115.0
## 264     8  19  Solar.R 244.0
## 265     8  20  Solar.R 190.0
## 266     8  21  Solar.R 259.0
## 267     8  22  Solar.R  36.0
## 268     8  23  Solar.R 255.0
## 269     8  24  Solar.R 212.0
## 270     8  25  Solar.R 238.0
## 271     8  26  Solar.R 215.0
## 272     8  27  Solar.R 153.0
## 273     8  28  Solar.R 203.0
## 274     8  29  Solar.R 225.0
## 275     8  30  Solar.R 237.0
## 276     8  31  Solar.R 188.0
## 277     9   1  Solar.R 167.0
## 278     9   2  Solar.R 197.0
## 279     9   3  Solar.R 183.0
## 280     9   4  Solar.R 189.0
## 281     9   5  Solar.R  95.0
## 282     9   6  Solar.R  92.0
## 283     9   7  Solar.R 252.0
## 284     9   8  Solar.R 220.0
## 285     9   9  Solar.R 230.0
## 286     9  10  Solar.R 259.0
## 287     9  11  Solar.R 236.0
## 288     9  12  Solar.R 259.0
## 289     9  13  Solar.R 238.0
## 290     9  14  Solar.R  24.0
## 291     9  15  Solar.R 112.0
## 292     9  16  Solar.R 237.0
## 293     9  17  Solar.R 224.0
## 294     9  18  Solar.R  27.0
## 295     9  19  Solar.R 238.0
## 296     9  20  Solar.R 201.0
## 297     9  21  Solar.R 238.0
## 298     9  22  Solar.R  14.0
## 299     9  23  Solar.R 139.0
## 300     9  24  Solar.R  49.0
## 301     9  25  Solar.R  20.0
## 302     9  26  Solar.R 193.0
## 303     9  27  Solar.R 145.0
## 304     9  28  Solar.R 191.0
## 305     9  29  Solar.R 131.0
## 306     9  30  Solar.R 223.0
## 307     5   1     Wind   7.4
## 308     5   2     Wind   8.0
## 309     5   3     Wind  12.6
## 310     5   4     Wind  11.5
## 311     5   5     Wind  14.3
## 312     5   6     Wind  14.9
## 313     5   7     Wind   8.6
## 314     5   8     Wind  13.8
## 315     5   9     Wind  20.1
## 316     5  10     Wind   8.6
## 317     5  11     Wind   6.9
## 318     5  12     Wind   9.7
## 319     5  13     Wind   9.2
## 320     5  14     Wind  10.9
## 321     5  15     Wind  13.2
## 322     5  16     Wind  11.5
## 323     5  17     Wind  12.0
## 324     5  18     Wind  18.4
## 325     5  19     Wind  11.5
## 326     5  20     Wind   9.7
## 327     5  21     Wind   9.7
## 328     5  22     Wind  16.6
## 329     5  23     Wind   9.7
## 330     5  24     Wind  12.0
## 331     5  25     Wind  16.6
## 332     5  26     Wind  14.9
## 333     5  27     Wind   8.0
## 334     5  28     Wind  12.0
## 335     5  29     Wind  14.9
## 336     5  30     Wind   5.7
## 337     5  31     Wind   7.4
## 338     6   1     Wind   8.6
## 339     6   2     Wind   9.7
## 340     6   3     Wind  16.1
## 341     6   4     Wind   9.2
## 342     6   5     Wind   8.6
## 343     6   6     Wind  14.3
## 344     6   7     Wind   9.7
## 345     6   8     Wind   6.9
## 346     6   9     Wind  13.8
## 347     6  10     Wind  11.5
## 348     6  11     Wind  10.9
## 349     6  12     Wind   9.2
## 350     6  13     Wind   8.0
## 351     6  14     Wind  13.8
## 352     6  15     Wind  11.5
## 353     6  16     Wind  14.9
## 354     6  17     Wind  20.7
## 355     6  18     Wind   9.2
## 356     6  19     Wind  11.5
## 357     6  20     Wind  10.3
## 358     6  21     Wind   6.3
## 359     6  22     Wind   1.7
## 360     6  23     Wind   4.6
## 361     6  24     Wind   6.3
## 362     6  25     Wind   8.0
## 363     6  26     Wind   8.0
## 364     6  27     Wind  10.3
## 365     6  28     Wind  11.5
## 366     6  29     Wind  14.9
## 367     6  30     Wind   8.0
## 368     7   1     Wind   4.1
## 369     7   2     Wind   9.2
## 370     7   3     Wind   9.2
## 371     7   4     Wind  10.9
## 372     7   5     Wind   4.6
## 373     7   6     Wind  10.9
## 374     7   7     Wind   5.1
## 375     7   8     Wind   6.3
## 376     7   9     Wind   5.7
## 377     7  10     Wind   7.4
## 378     7  11     Wind   8.6
## 379     7  12     Wind  14.3
## 380     7  13     Wind  14.9
## 381     7  14     Wind  14.9
## 382     7  15     Wind  14.3
## 383     7  16     Wind   6.9
## 384     7  17     Wind  10.3
## 385     7  18     Wind   6.3
## 386     7  19     Wind   5.1
## 387     7  20     Wind  11.5
## 388     7  21     Wind   6.9
## 389     7  22     Wind   9.7
## 390     7  23     Wind  11.5
## 391     7  24     Wind   8.6
## 392     7  25     Wind   8.0
## 393     7  26     Wind   8.6
## 394     7  27     Wind  12.0
## 395     7  28     Wind   7.4
## 396     7  29     Wind   7.4
## 397     7  30     Wind   7.4
## 398     7  31     Wind   9.2
## 399     8   1     Wind   6.9
## 400     8   2     Wind  13.8
## 401     8   3     Wind   7.4
## 402     8   4     Wind   6.9
## 403     8   5     Wind   7.4
## 404     8   6     Wind   4.6
## 405     8   7     Wind   4.0
## 406     8   8     Wind  10.3
## 407     8   9     Wind   8.0
## 408     8  10     Wind   8.6
## 409     8  11     Wind  11.5
## 410     8  12     Wind  11.5
## 411     8  13     Wind  11.5
## 412     8  14     Wind   9.7
## 413     8  15     Wind  11.5
## 414     8  16     Wind  10.3
## 415     8  17     Wind   6.3
## 416     8  18     Wind   7.4
## 417     8  19     Wind  10.9
## 418     8  20     Wind  10.3
## 419     8  21     Wind  15.5
## 420     8  22     Wind  14.3
## 421     8  23     Wind  12.6
## 422     8  24     Wind   9.7
## 423     8  25     Wind   3.4
## 424     8  26     Wind   8.0
## 425     8  27     Wind   5.7
## 426     8  28     Wind   9.7
## 427     8  29     Wind   2.3
## 428     8  30     Wind   6.3
## 429     8  31     Wind   6.3
## 430     9   1     Wind   6.9
## 431     9   2     Wind   5.1
## 432     9   3     Wind   2.8
## 433     9   4     Wind   4.6
## 434     9   5     Wind   7.4
## 435     9   6     Wind  15.5
## 436     9   7     Wind  10.9
## 437     9   8     Wind  10.3
## 438     9   9     Wind  10.9
## 439     9  10     Wind   9.7
## 440     9  11     Wind  14.9
## 441     9  12     Wind  15.5
## 442     9  13     Wind   6.3
## 443     9  14     Wind  10.9
## 444     9  15     Wind  11.5
## 445     9  16     Wind   6.9
## 446     9  17     Wind  13.8
## 447     9  18     Wind  10.3
## 448     9  19     Wind  10.3
## 449     9  20     Wind   8.0
## 450     9  21     Wind  12.6
## 451     9  22     Wind   9.2
## 452     9  23     Wind  10.3
## 453     9  24     Wind  10.3
## 454     9  25     Wind  16.6
## 455     9  26     Wind   6.9
## 456     9  27     Wind  13.2
## 457     9  28     Wind  14.3
## 458     9  29     Wind   8.0
## 459     9  30     Wind  11.5
## 460     5   1     Temp  67.0
## 461     5   2     Temp  72.0
## 462     5   3     Temp  74.0
## 463     5   4     Temp  62.0
## 464     5   5     Temp  56.0
## 465     5   6     Temp  66.0
## 466     5   7     Temp  65.0
## 467     5   8     Temp  59.0
## 468     5   9     Temp  61.0
## 469     5  10     Temp  69.0
## 470     5  11     Temp  74.0
## 471     5  12     Temp  69.0
## 472     5  13     Temp  66.0
## 473     5  14     Temp  68.0
## 474     5  15     Temp  58.0
## 475     5  16     Temp  64.0
## 476     5  17     Temp  66.0
## 477     5  18     Temp  57.0
## 478     5  19     Temp  68.0
## 479     5  20     Temp  62.0
## 480     5  21     Temp  59.0
## 481     5  22     Temp  73.0
## 482     5  23     Temp  61.0
## 483     5  24     Temp  61.0
## 484     5  25     Temp  57.0
## 485     5  26     Temp  58.0
## 486     5  27     Temp  57.0
## 487     5  28     Temp  67.0
## 488     5  29     Temp  81.0
## 489     5  30     Temp  79.0
## 490     5  31     Temp  76.0
## 491     6   1     Temp  78.0
## 492     6   2     Temp  74.0
## 493     6   3     Temp  67.0
## 494     6   4     Temp  84.0
## 495     6   5     Temp  85.0
## 496     6   6     Temp  79.0
## 497     6   7     Temp  82.0
## 498     6   8     Temp  87.0
## 499     6   9     Temp  90.0
## 500     6  10     Temp  87.0
## 501     6  11     Temp  93.0
## 502     6  12     Temp  92.0
## 503     6  13     Temp  82.0
## 504     6  14     Temp  80.0
## 505     6  15     Temp  79.0
## 506     6  16     Temp  77.0
## 507     6  17     Temp  72.0
## 508     6  18     Temp  65.0
## 509     6  19     Temp  73.0
## 510     6  20     Temp  76.0
## 511     6  21     Temp  77.0
## 512     6  22     Temp  76.0
## 513     6  23     Temp  76.0
## 514     6  24     Temp  76.0
## 515     6  25     Temp  75.0
## 516     6  26     Temp  78.0
## 517     6  27     Temp  73.0
## 518     6  28     Temp  80.0
## 519     6  29     Temp  77.0
## 520     6  30     Temp  83.0
## 521     7   1     Temp  84.0
## 522     7   2     Temp  85.0
## 523     7   3     Temp  81.0
## 524     7   4     Temp  84.0
## 525     7   5     Temp  83.0
## 526     7   6     Temp  83.0
## 527     7   7     Temp  88.0
## 528     7   8     Temp  92.0
## 529     7   9     Temp  92.0
## 530     7  10     Temp  89.0
## 531     7  11     Temp  82.0
## 532     7  12     Temp  73.0
## 533     7  13     Temp  81.0
## 534     7  14     Temp  91.0
## 535     7  15     Temp  80.0
## 536     7  16     Temp  81.0
## 537     7  17     Temp  82.0
## 538     7  18     Temp  84.0
## 539     7  19     Temp  87.0
## 540     7  20     Temp  85.0
## 541     7  21     Temp  74.0
## 542     7  22     Temp  81.0
## 543     7  23     Temp  82.0
## 544     7  24     Temp  86.0
## 545     7  25     Temp  85.0
## 546     7  26     Temp  82.0
## 547     7  27     Temp  86.0
## 548     7  28     Temp  88.0
## 549     7  29     Temp  86.0
## 550     7  30     Temp  83.0
## 551     7  31     Temp  81.0
## 552     8   1     Temp  81.0
## 553     8   2     Temp  81.0
## 554     8   3     Temp  82.0
## 555     8   4     Temp  86.0
## 556     8   5     Temp  85.0
## 557     8   6     Temp  87.0
## 558     8   7     Temp  89.0
## 559     8   8     Temp  90.0
## 560     8   9     Temp  90.0
## 561     8  10     Temp  92.0
## 562     8  11     Temp  86.0
## 563     8  12     Temp  86.0
## 564     8  13     Temp  82.0
## 565     8  14     Temp  80.0
## 566     8  15     Temp  79.0
## 567     8  16     Temp  77.0
## 568     8  17     Temp  79.0
## 569     8  18     Temp  76.0
## 570     8  19     Temp  78.0
## 571     8  20     Temp  78.0
## 572     8  21     Temp  77.0
## 573     8  22     Temp  72.0
## 574     8  23     Temp  75.0
## 575     8  24     Temp  79.0
## 576     8  25     Temp  81.0
## 577     8  26     Temp  86.0
## 578     8  27     Temp  88.0
## 579     8  28     Temp  97.0
## 580     8  29     Temp  94.0
## 581     8  30     Temp  96.0
## 582     8  31     Temp  94.0
## 583     9   1     Temp  91.0
## 584     9   2     Temp  92.0
## 585     9   3     Temp  93.0
## 586     9   4     Temp  93.0
## 587     9   5     Temp  87.0
## 588     9   6     Temp  84.0
## 589     9   7     Temp  80.0
## 590     9   8     Temp  78.0
## 591     9   9     Temp  75.0
## 592     9  10     Temp  73.0
## 593     9  11     Temp  81.0
## 594     9  12     Temp  76.0
## 595     9  13     Temp  77.0
## 596     9  14     Temp  71.0
## 597     9  15     Temp  71.0
## 598     9  16     Temp  78.0
## 599     9  17     Temp  67.0
## 600     9  18     Temp  76.0
## 601     9  19     Temp  68.0
## 602     9  20     Temp  82.0
## 603     9  21     Temp  64.0
## 604     9  22     Temp  71.0
## 605     9  23     Temp  81.0
## 606     9  24     Temp  69.0
## 607     9  25     Temp  63.0
## 608     9  26     Temp  70.0
## 609     9  27     Temp  77.0
## 610     9  28     Temp  75.0
## 611     9  29     Temp  76.0
## 612     9  30     Temp  68.0

А из получившейся длинной таблицы восстановите исходную!

air_wide <- dcast(air_long, Day + Month ~ variable) # вместо пропуска должна быть переменная с несколькими значениями
air_wide
##     Day Month Ozone Solar.R Wind Temp
## 1     1     5    41     190  7.4   67
## 2     1     6    NA     286  8.6   78
## 3     1     7   135     269  4.1   84
## 4     1     8    39      83  6.9   81
## 5     1     9    96     167  6.9   91
## 6     2     5    36     118  8.0   72
## 7     2     6    NA     287  9.7   74
## 8     2     7    49     248  9.2   85
## 9     2     8     9      24 13.8   81
## 10    2     9    78     197  5.1   92
## 11    3     5    12     149 12.6   74
## 12    3     6    NA     242 16.1   67
## 13    3     7    32     236  9.2   81
## 14    3     8    16      77  7.4   82
## 15    3     9    73     183  2.8   93
## 16    4     5    18     313 11.5   62
## 17    4     6    NA     186  9.2   84
## 18    4     7    NA     101 10.9   84
## 19    4     8    78      NA  6.9   86
## 20    4     9    91     189  4.6   93
## 21    5     5    NA      NA 14.3   56
## 22    5     6    NA     220  8.6   85
## 23    5     7    64     175  4.6   83
## 24    5     8    35      NA  7.4   85
## 25    5     9    47      95  7.4   87
## 26    6     5    28      NA 14.9   66
## 27    6     6    NA     264 14.3   79
## 28    6     7    40     314 10.9   83
## 29    6     8    66      NA  4.6   87
## 30    6     9    32      92 15.5   84
## 31    7     5    23     299  8.6   65
## 32    7     6    29     127  9.7   82
## 33    7     7    77     276  5.1   88
## 34    7     8   122     255  4.0   89
## 35    7     9    20     252 10.9   80
## 36    8     5    19      99 13.8   59
## 37    8     6    NA     273  6.9   87
## 38    8     7    97     267  6.3   92
## 39    8     8    89     229 10.3   90
## 40    8     9    23     220 10.3   78
## 41    9     5     8      19 20.1   61
## 42    9     6    71     291 13.8   90
## 43    9     7    97     272  5.7   92
## 44    9     8   110     207  8.0   90
## 45    9     9    21     230 10.9   75
## 46   10     5    NA     194  8.6   69
## 47   10     6    39     323 11.5   87
## 48   10     7    85     175  7.4   89
## 49   10     8    NA     222  8.6   92
## 50   10     9    24     259  9.7   73
## 51   11     5     7      NA  6.9   74
## 52   11     6    NA     259 10.9   93
## 53   11     7    NA     139  8.6   82
## 54   11     8    NA     137 11.5   86
## 55   11     9    44     236 14.9   81
## 56   12     5    16     256  9.7   69
## 57   12     6    NA     250  9.2   92
## 58   12     7    10     264 14.3   73
## 59   12     8    44     192 11.5   86
## 60   12     9    21     259 15.5   76
## 61   13     5    11     290  9.2   66
## 62   13     6    23     148  8.0   82
## 63   13     7    27     175 14.9   81
## 64   13     8    28     273 11.5   82
## 65   13     9    28     238  6.3   77
## 66   14     5    14     274 10.9   68
## 67   14     6    NA     332 13.8   80
## 68   14     7    NA     291 14.9   91
## 69   14     8    65     157  9.7   80
## 70   14     9     9      24 10.9   71
## 71   15     5    18      65 13.2   58
## 72   15     6    NA     322 11.5   79
## 73   15     7     7      48 14.3   80
## 74   15     8    NA      64 11.5   79
## 75   15     9    13     112 11.5   71
## 76   16     5    14     334 11.5   64
## 77   16     6    21     191 14.9   77
## 78   16     7    48     260  6.9   81
## 79   16     8    22      71 10.3   77
## 80   16     9    46     237  6.9   78
## 81   17     5    34     307 12.0   66
## 82   17     6    37     284 20.7   72
## 83   17     7    35     274 10.3   82
## 84   17     8    59      51  6.3   79
## 85   17     9    18     224 13.8   67
## 86   18     5     6      78 18.4   57
## 87   18     6    20      37  9.2   65
## 88   18     7    61     285  6.3   84
## 89   18     8    23     115  7.4   76
## 90   18     9    13      27 10.3   76
## 91   19     5    30     322 11.5   68
## 92   19     6    12     120 11.5   73
## 93   19     7    79     187  5.1   87
## 94   19     8    31     244 10.9   78
## 95   19     9    24     238 10.3   68
## 96   20     5    11      44  9.7   62
## 97   20     6    13     137 10.3   76
## 98   20     7    63     220 11.5   85
## 99   20     8    44     190 10.3   78
## 100  20     9    16     201  8.0   82
## 101  21     5     1       8  9.7   59
## 102  21     6    NA     150  6.3   77
## 103  21     7    16       7  6.9   74
## 104  21     8    21     259 15.5   77
## 105  21     9    13     238 12.6   64
## 106  22     5    11     320 16.6   73
## 107  22     6    NA      59  1.7   76
## 108  22     7    NA     258  9.7   81
## 109  22     8     9      36 14.3   72
## 110  22     9    23      14  9.2   71
## 111  23     5     4      25  9.7   61
## 112  23     6    NA      91  4.6   76
## 113  23     7    NA     295 11.5   82
## 114  23     8    NA     255 12.6   75
## 115  23     9    36     139 10.3   81
## 116  24     5    32      92 12.0   61
## 117  24     6    NA     250  6.3   76
## 118  24     7    80     294  8.6   86
## 119  24     8    45     212  9.7   79
## 120  24     9     7      49 10.3   69
## 121  25     5    NA      66 16.6   57
## 122  25     6    NA     135  8.0   75
## 123  25     7   108     223  8.0   85
## 124  25     8   168     238  3.4   81
## 125  25     9    14      20 16.6   63
## 126  26     5    NA     266 14.9   58
## 127  26     6    NA     127  8.0   78
## 128  26     7    20      81  8.6   82
## 129  26     8    73     215  8.0   86
## 130  26     9    30     193  6.9   70
## 131  27     5    NA      NA  8.0   57
## 132  27     6    NA      47 10.3   73
## 133  27     7    52      82 12.0   86
## 134  27     8    NA     153  5.7   88
## 135  27     9    NA     145 13.2   77
## 136  28     5    23      13 12.0   67
## 137  28     6    NA      98 11.5   80
## 138  28     7    82     213  7.4   88
## 139  28     8    76     203  9.7   97
## 140  28     9    14     191 14.3   75
## 141  29     5    45     252 14.9   81
## 142  29     6    NA      31 14.9   77
## 143  29     7    50     275  7.4   86
## 144  29     8   118     225  2.3   94
## 145  29     9    18     131  8.0   76
## 146  30     5   115     223  5.7   79
## 147  30     6    NA     138  8.0   83
## 148  30     7    64     253  7.4   83
## 149  30     8    84     237  6.3   96
## 150  30     9    20     223 11.5   68
## 151  31     5    37     279  7.4   76
## 152  31     7    59     254  9.2   81
## 153  31     8    85     188  6.3   94

Ура :)