Третья часть перевода статьи Хадлея Викхама.
Таблица 11. Исходный массив данных по погоде. Существует столбец для каждого возможного дня в месяце. Столбцы d9 - d31 не показаны для экономии места
id
год
месяц
элемент
d1
d2
d3
d4
d5
d6
d7
d8
MX17004
2010
1
Тмакс
-
-
-
-
-
-
-
-
MX17004
2010
1
Тмин
-
-
-
-
-
-
-
-
MX17004
2010
2
Тмакс
-
27,3
24,1
-
-
-
-
-
MX17004
2010
2
Тмин
-
14,4
14,4
-
-
-
-
-
MX17004
2010
3
Тмакс
-
-
-
-
32,1
-
-
-
MX17004
2010
3
Тмин
-
-
-
-
14,2
-
-
-
MX17004
2010
4
Тмакс
-
-
-
-
-
-
-
-
MX17004
2010
4
Тмин
-
-
-
-
-
-
-
-
MX17004
2010
5
Тмакс
-
-
-
-
-
-
-
-
MX17004
2010
5
Тмин
-
-
-
-
-
-
-
-
Таблица 12: (а) - расплавленный погодный массив данных. Он почти упорядочен, но столбец «элемент» содержит не значения, а названия переменных. Отсутствующие значения отброшены для экономии места. (б) Упорядоченный погодный массив данных. Каждая строка представляет собой метеорологическое измерение за один день. Измеряемых переменных две: минимальная (Тмин) и максимальная (Тмакс) температура. Все остальные переменные фиксированные.
id
дата
элемент
Значение
MX17004
2010-01-30
Тмакс
27,8
MX17004
2010-01-30
Тмин
14,5
MX17004
2010-02-02
Тмакс
27,3
MX17004
2010-02-02
Тмин
14,4
MX17004
2010-02-03
Тмакс
24,1
MX17004
2010-02-03
Тмин
14,4
MX17004
2010-02-11
Тмакс
29,7
MX17004
2010-02-11
Тмин
13,4
MX17004
2010-02-23
Тмакс
29,9
MX17004
2010-02-23
Тмин
10,7
(а) расплавленные данные
id
дата
Тмакс
Тмин
MX17004
2010-01-30
27,8
14,5
MX17004
2010-02-02
27,3
14,4
MX17004
2010-02-03
24,1
14,4
MX17004
2010-02-11
29,7
13,4
MX17004
2010-02-23
29,9
10,7
MX17004
2010-03-05
32,1
14,2
MX17004
2010-03-10
34,5
16,8
MX17004
2010-03-16
31,1
17,6
MX17004
2010-04-27
36,3
16,7
MX17004
2010-05-27
33,2
18,2
(б) упорядоченные данные
Таблица 13. Нормализованный массив данных Биллборда разбит на массив песен (сверху) и массив рангов (снизу). Показаны первые 15 строк каждого массива, в массиве песен не показан «жанр», в массиве рангов не показана «неделя».
id
Певец
Композиция
Время
1
2 Pac
Baby Don’t Cry
4:22
2
2Ge+her
The Hardest Part Of …
3:15
3
3 Doors Down
Kryptonite
3:53
4
3 Doors Down
Loser
4:24
5
504 Boyz
Wobble Wobble
3:35
6
98^0
Give Me Just One Nig…
3:24
7
A*Teens
Dancing Queen
3:44
8
Aaliyah
I Don’t Wanna
4:15
9
Aaliyah
Try Again
4:03
10
Adams, Yolanda
Open My Heart
6:30
11
Adkins, Trace
More
3:05
12
Aguilera, Christina
Come On Over Baby
3:38
13
Aguilera, Christina
I Turn To You
4:00
14
Aguilera, Christina
What A Girl Wants
3:18
15
Alice Deejay
Better Off Alone
6:50
(а) массив данных песен
id
Дата
Ранг
1
2000-02-26
87
1
2000-03-04
82
1
2000-03-11
72
1
2000-03-18
77
1
2000-03-25
87
1
2000-04-01
94
1
2000-04-08
99
2
2000-09-02
91
2
2000-09-09
87
2
2000-09-16
92
3
2000-04-08
81
3
2000-04-15
70
3
2000-04-22
68
3
2000-04-29
67
3
2000-05-06
66
(б) массив данных рангов
3.5. Одно и то же наблюдение хранится в разных таблицахНередко можно найти значения данных об одном типе наблюдения распределенными между несколькими таблицами или файлами. Эти таблицы или файлы часто разбиты по значению другой переменной, так что каждая из них представляет отдельный год, или человека, или местность. Если формат индивидуальных записей унифицирован, эту проблему решить несложно:
1) Прочитать файлы в лист таблиц;
2) Для каждой таблицы добавить новый столбец с записью исходного имени файла (потому что имя файла часто является значением какой-нибудь важной переменной);
3) Объединить все таблицы в одну таблицу.
Пакет «plyr» делает эту задачу довольно простой в R. Нижеуказанный код создает вектор с именами файлов в директории (data/), который сопоставляет регулярные выражения (оканчивающиеся на .csv). Далее мы называем каждый элемент вектора именем файла. Мы это делаем, т.к. «plyr» сохранит имена в следующем шаге, гарантируя, что в каждой строке в финальной таблице обозначен ее источник. Наконец, цикл «ldply()» пробегает по каждой ссылке, читает файлы csv и объединяет результаты в единую таблицу.
R> paths <- dir("data", pattern = "\\.csv$", full.names = TRUE)
R> names(paths) <- basename(paths)
R> ldply(paths, read.csv, stringsAsFactors = FALSE)
С того момента как у вас появляется единая таблица, вы можете осуществлять дополнительное упорядочивание так, как понадобится. Пример такого типа упорядочивания может быть найден по ссылке
https://github.com/hadley/data-baby-names, где приводится 129 ежегодных таблиц детских имен, предоставленных Администрацией социального обеспечения (США), которые объединяются в единый файл.
Более сложная ситуация происходит, когда массив данных меняется в течение времени. К примеру, массивы данных могут содержать различные переменные; одни и те же переменные с разными именами; различные форматы файлов; либо различные обозначения для отсутствующих значений. Такая ситуация может потребовать от вас упорядочивать каждый файл индивидуально (или, если вам повезло, небольшими группами) и уже после упорядочивания объединять их. Пример такого типа упорядочивания приведен по ссылке
https://github.com/hadley/data-fuel-economy, где показано упорядочивание данных Агентства по охране окружающей среды по экономии топлива по более 50000 автомобилей с 1978 по 2008 годы. Исходные данные доступны онлайн, но каждый год сохраняется в отдельном файле, и существует четыре крупных формата с множеством мелких разновидностей, что делает упорядочивание этого массива данных серьезным вызовом.
4. Упорядоченные инструментыДопустим, у вас есть упорядоченный массив данных, что вы можете с ним сделать? Упорядоченная дата имеет ценность только в том случае, если она делает анализ легче. Данный раздел обсуждает упорядоченные инструменты, т.е. инструменты, которые принимают упорядоченные массивы данных в качестве входа и выпускают упорядоченные массивы данных в качестве выхода. Упорядоченные инструменты полезны, т.к. выход одного инструмента может быть использован как вход в другой. Это позволяет вам просто и легко комбинировать разные инструменты для решения проблемы. Упорядоченные данные также гарантируют, что переменные сохраняются унифицированным и прозрачным способом. Это делает и сам каждый инструмент проще, т.к. ему не нужно представлять из себя швейцарский армейский нож со множеством лезвия для работы с разными структурами массивов данных.
Инструменты могут быть неупорядоченными по двум причинам: либо они принимают неупорядоченный массив данных в качестве входа (инструменты неупорядоченного входа), либо они выпускают неупорядоченный массив данных в качестве выхода (инструменты неупорядоченного выхода). Инструменты неупорядоченного входа как правило более сложные чем инструменты неупорядоченного выхода, т.к. они должны включать в себя некоторые элементы процесса упорядочивания. Это может быть полезным для распространенных типов неупорядоченных массивов данных, но это обычно делает функцию более сложной, более тяжелой в использовании и более тяжелой в поддержке. Инструменты неупорядоченного выхода бесполезны и сильно замедляют анализ, потому что они не могут быть легко скомбинированы, и вы постоянно должны думать о том, как преобразовать один формат в другой. Мы увидим примеры обоих типов инструментов в следующих разделах.
Далее, я дам примеры упорядоченных и неупорядоченных инструментов для трех важных компонентов анализа: манипуляция данными, визуализация и моделирование. Я обращу особенное внимание на инструменты, предоставленные R (Группа развития ядра R, 2011), потому что этот язык имеет множество существующих упорядоченных инструментов, но я также затрону другие статистические программные среды.
4.1. МанипуляцияМанипуляция данными включает в себя преобразование переменных (например, «log» или «sqrt»), также, как их объединение, фильтрацию и сортировку. По моему опыту, это четыре фундаментальные глаголы манипуляции данными:
* Фильтровать (filter) - разбиение или удаление наблюдений, но основе некоторых условий;
* Преобразовать (transform) - добавление или модификация переменных. Эти модификации могут включать в себя единичные переменные (например, логарифмическое преобразование) или множество переменных (например, вычисление плотности из массы и объема);
* Объединить (aggregate) - соединение нескольких значений в единственное значение (например, суммируя или находя среднее);
* Сортировать (sort) - изменять порядок наблюдений.
Все эти операции становятся проще, когда есть унифицированный способ обращения к переменным. Упорядоченные данные обеспечивают это, т.к. каждая переменная имеет свой столбец.
В языке R фильтрация и преобразование производятся за счет таких базовых функций R, как «subset()» (выделить подмножество) и «transform()». Они являются инструментами упорядоченного входа и выхода. Функция «aggregate()» осуществляет объединение по группам. Это инструмент упорядоченного входа. Если используется единичный метод объединения, это также и инструмент упорядоченного выхода. Пакет «plyr» обеспечивает упорядоченные функции «summarise()» и «arrange()» для объединения и сортировки.
Четыре глагола могут, как это часто и происходит на практике, быть модифицированы предлогом «by» (приблизительный перевод - предлог «по», например, «сортировать по переменной a» - прим. перев.). Нам часто нужно производить действие по группам: объединять, преобразовывать, выделять подмножества, выбирать наибольшее в каждой группе, среднее по повторам и т.п. Комбинация каждого из четырех глаголов с оператором «by» позволяет им работать на подмножествах таблицы за один прием. Большинство процедур «SAS» имеет формулировку «by», что позволяет операции быть исполняемой по группе, и эти процедуры в основном являются инструментами упорядоченного входа. Ядро R содержит функцию «by()», которая является инструментом упорядоченного входа, однако не инструментом упорядоченного выхода, т.к. производит «list» (лист, термин в языке R - прим. перев.). Функция «ddply()» из пакета «plyr» является ее упорядоченной альтернативой.
Другие инструменты нужны, когда у нас множество массивов данных. Преимущество упорядоченных данных в легкости, с которой они могут быть скомбинированы с другими упорядоченными массивами данных. Все, что нужно - это оператор объединения, который работает сопоставлением общих переменных и добавлением новых столбцов. Это осуществлено в функции «merge()» в ядре языка R, или в функции «join()» в пакете «plyr». Сравните эти функции с трудностью соединения массивов данных, хранящихся в матрицах. Эта последняя задача обычно требует мучительного выравнивания, пока могут быть использованы матричные операторы, которые могут допустить ошибки, весьма трудные для обнаружения.
4.2. ВизуализацияУпорядоченные инструменты визуализации должны быть только инструментами упорядоченного входа, т.к. их выход является визуальным. Предметно-ориентированные языки работают особенно хорошо для визуализации упорядоченных массивов данных, т.к. они могут описывать визуализацию как сопоставление между значениями переменных и визуальными свойствами графика (например, позицией, размером, формой, цветом). Это идея, лежащая в основе языка графиков (Вилкинсон, 2005) и языка слоев графиков (Викхам, 2010), расширения, скроенного специально для языка R.
Большинство графических инструментов в языке R является инструментами упорядоченного входа, включая функцию «plot()» из ядра, семейство графиков пакетов «lattice» (Саркар, 2008) и «ggplot2» (Викхам, 2009). Некоторые специализированные инструменты существуют для визуализации неупорядоченных массивов данных. Некоторые функции ядра, такие, как «barplot()», «matplot()», «dotchart()» и «mosaicplot()» работают с неупорядоченным массивом данных, где переменные распределены между множеством столбцов. Так же, график с параллельными координатами (Вегман, 1990, Инселберг, 1985) может быть использован для создания графиков временных серий для неупорядоченных массивов данных, где каждая точка времени является столбцом.
Продолжение следует