长而宽的数据——什么时候使用什么?

Long and wide data – when to use what?

我正在将来自不同数据集的数据编译成一个数据集以供分析。我会做数据探索,尝试不同的东西来找出数据中可能隐藏的规律,所以我目前没有具体的方法。现在我想知道是否应该将我的数据编译成长格式或宽格式。

我应该使用哪种格式,为什么?

我知道数据可以从长到宽重新整形,反之亦然,但仅此功能的存在意味着有时会出现重新整形的需要,而这种需要反过来又意味着特定格式可能更适合某项任务。那么我什么时候需要哪种格式,为什么?

我问的不是性能。这已在其他问题中涵盖。

恕我直言,答案很简单。默认情况下,长格式占用更多 space,因为还需要表示新的 "variable" 列。然而, 长数据格式可以显着压缩您的数据。如果你有一个非常稀疏的矩阵——这是如果很多列都是 NA——你可以指定 na.rm=true。

此外,它在许多情况下允许更有效的计算。但是你定义的那个超出了范围。

正如 Roland 所提到的,大多数 R 函数都需要长格式,并且通常更容易以这种方式处理数据。

但另一方面,人们更容易查看和理解宽格式,尤其是在输入和验证时,人类理解对于确保质量和准确性很重要。

所以我发现数据开始时往往是宽格式,然后随着它越来越多地用于处理而变长。幸运的是,现在来回转换非常容易,尤其是使用 tidyr 包时。

Hadley Wickham 的 Tidy Data 论文和 tidyr 包是他的(最新)原则实施,是一个很好的起点。

这个问题的粗略答案是,在处理过程中,数据应该总是很长,并且只应该为了显示目的而加宽。不过要小心,因为这里的 "long" 更多指的是 "tidy",而不是纯粹的长格式。

例子

mtcars 数据集为例。这已经是整洁的形式,因为每一行代表一个单一的观察。所以"lengthening"它,得到这样的东西

        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

适得其反; mpgcyl 在任何意义上都没有可比性。

获取 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
...

提供可能有用的可视化,但出于数据分析目的,非常不方便,因为计算诸如增长率之类的东西变得很麻烦。