长而宽的数据——什么时候使用什么?
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
适得其反; 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
...
提供可能有用的可视化,但出于数据分析目的,非常不方便,因为计算诸如增长率之类的东西变得很麻烦。
我正在将来自不同数据集的数据编译成一个数据集以供分析。我会做数据探索,尝试不同的东西来找出数据中可能隐藏的规律,所以我目前没有具体的方法。现在我想知道是否应该将我的数据编译成长格式或宽格式。
我应该使用哪种格式,为什么?
我知道数据可以从长到宽重新整形,反之亦然,但仅此功能的存在意味着有时会出现重新整形的需要,而这种需要反过来又意味着特定格式可能更适合某项任务。那么我什么时候需要哪种格式,为什么?
我问的不是性能。这已在其他问题中涵盖。
恕我直言,答案很简单。默认情况下,长格式占用更多 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
适得其反; 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
...
提供可能有用的可视化,但出于数据分析目的,非常不方便,因为计算诸如增长率之类的东西变得很麻烦。