Длинные и широкие данные - когда использовать что?
Я нахожусь в процессе компиляции данных из разных наборов данных в один набор данных для анализа. Я буду заниматься исследованием данных, пробуя разные вещи, чтобы выяснить, какие закономерности могут быть скрыты в данных, поэтому в настоящее время я не имею в виду конкретный метод. Теперь мне интересно, должен ли я скомпилировать свои данные в длинный или широкий формат.
Какой формат мне использовать и почему?
Я понимаю, что данные могут быть преобразованы из длинных в широкие или наоборот, но само существование этой функциональности подразумевает, что иногда возникает необходимость в изменении формы, и эта потребность, в свою очередь, подразумевает, что конкретный формат может лучше подходить для определенной задачи. Так когда мне нужен какой формат и зачем?
Я не спрашиваю о производительности. Это было рассмотрено в других вопросах.
3 ответа
Tidy Data Хэдли Уикхем, и tidyr
Пакет, который является его (последней) реализацией его принципов, является отличным местом для начала.
Грубый ответ на этот вопрос заключается в том, что во время обработки данные всегда должны быть длинными и расширяться только для целей отображения. Однако будьте осторожны с этим, так как здесь "длинный" относится скорее к "опрятному", чем к чистой длинной форме.
Примеры
Взять, к примеру, mtcars
набор данных. Это уже в чистом виде, в котором каждый ряд представляет одно наблюдение. Так что "удлиняя" это, чтобы получить что-то вроде этого
model type value
1 AMC Javelin mpg 15.200
2 AMC Javelin cyl 8.000
3 AMC Javelin disp 304.000
4 AMC Javelin hp 150.000
5 AMC Javelin drat 3.150
6 AMC Javelin wt 3.435
является контрпродуктивным; mpg
а также cyl
не сопоставимы ни в каком значимом смысле.
Принимая ChickWeight
набор данных (который находится в длинной форме) и преобразование его в широкий по времени
require(tidyr)
ChickWeight %>% spread(Time, weight)
Chick Diet 0 2 4 6 8 10 12 14 16 18 20 21
1 18 1 39 35 NA NA NA NA NA NA NA NA NA NA
2 16 1 41 45 49 51 57 51 54 NA NA NA NA NA
3 15 1 41 49 56 64 68 68 67 68 NA NA NA NA
4 13 1 41 48 53 60 65 67 71 70 71 81 91 96
5 9 1 42 51 59 68 85 96 90 92 93 100 100 98
6 20 1 41 47 54 58 65 73 77 89 98 107 115 117
7 10 1 41 44 52 63 74 81 89 96 101 112 120 124
8 8 1 42 50 61 71 84 93 110 116 126 134 125 NA
9 17 1 42 51 61 72 83 89 98 103 113 123 133 142
10 19 1 43 48 55 62 65 71 82 88 106 120 144 157
11 4 1 42 49 56 67 74 87 102 108 136 154 160 157
12 6 1 41 49 59 74 97 124 141 148 155 160 160 157
13 11 1 43 51 63 84 112 139 168 177 182 184 181 175
...
дает визуализацию, которая может быть полезной, но для целей анализа данных очень неудобна, так как такие вещи, как скорость роста, становятся громоздкими.
Как отметил Роланд, большинству функций R он нужен в длинном формате, и зачастую таким способом обрабатывать данные проще.
Но, с другой стороны, людям легче просматривать и понимать широкий формат, особенно когда он вводится и проверяется, где понимание человеком важно для обеспечения качества и точности.
Таким образом, я вижу, что данные имеют тенденцию начинать жизнь в широком формате, а затем становятся длиннее, поскольку их все больше используют для обработки. К счастью, преобразование туда и обратно довольно легко в настоящее время, особенно с tidyr
пакет.
Ответ imho довольно прямой. По умолчанию длинный формат занимает значительно больше места, так как новый столбец "переменная" также должен быть представлен. Однако длинный формат данных может значительно сжать ваши данные. Если у вас очень разреженная матрица - это если много столбцов NA, вы можете указать na.rm = true.
Кроме того, это позволяет более эффективные вычисления во многих случаях. Но тот, который вы определили вне области.