В нашем документе смешан код 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
:)
В 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
Рассмотрим данные по зарплатам со страницы 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
wage
и sector
?Для качественных переменных можно создавать таблицы сопряжённости. По строкам указываются значения одной переменной, по столбцам — другой, а на пересечении стоит количество наблюдений.
Таблицу сопряжённости можно создать командой 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
Какой вывод можно сделать? Зависимы ли признаки?
Упражнение 3.
Возьмём встроенный набор данных 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
Если качественных переменных больше двух, то разумнее посчитать таблицу частот. Мы группируем наблюдения по трём переменным и для каждой группы считаем количество наблюдений 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
Опишите словами, что изображено на графике:
mosaic(data = Arthritis, ~ Sex + Treatment + Improved, shade = TRUE, legend = TRUE)
Возьмём встроенный набор данных про автомобили mtcars
. Напоминалка: посмотреть описание данных можно, набрав в консоли ?mtcars
.
Упражнение 5.
С помощью консоли вызовите справку и прочтите смысл переменных cyl
, mpg
и am
.
Команда 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')
Иногда мы хотим сгруппировать наблюдения по нескольким переменным и для каждой группы что-то посчитать!
Посчитаем для каждого цвета бриллианта максимальную, минимальную цену!
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
Упражнение 7.
cut
отберите три группы с минимальной med_price
:
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
Упражнение 8.
clarity
отсортируйте по возрастанию медианной массы
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
Графиков в 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.
Количество цилиндров 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
.
facet_grid
написать . ~ am
?И для примера более сложный график с кучей слоёв!
Вспомним старую таблицу частот:
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
?
Подсказка: просто удалите по очереди каждую из этих строк, и посмотрите, что исчезает!
Вдохновиться примерами и нарисовать себе “такой же, но с перламутровыми пуговицами” потоковый график
Таблицы можно создавать и самим 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
Сколько наблюдений получается в объединённой таблице в каждом случае?
Упражнение 14.
Нужно объединить таблицы 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-...
flights
таблицу flights
с помощью функции left_join()
. В качестве аргумента by
используйте вектор из названий общих столбцов: year
, month
, day
, hour
и origin
.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_join()
. Сколько наблюдений в получившейся таблице?left_join
и inner_join
?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...
Таблицы бывают длинными и широкими! При поступлении нового наблюдения длинная растёт в длину, а широкая может и в ширину :)
Возьмём квартальные данные Росстата о ВВП по источникам доходов.
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
Ура :)