gather() 和 spread() 这两个函数在tidyr这个package里,是专门用来做数据清洗的包。虽然说数据清洗这种机械的工作随便拉个人培训一个月就能做,但是总之还是要学会…… 在R中,数据是以data frame的形式存在,每一行是一个observation,每一列则是一个variable,如果行和列放错了位置就变成需要清洗的脏数据了,spread() 和 gather() 就是帮我们把行和列归位的。 上个例子: data <- data.frame(
time = as.Date('2018-10-12') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
data长这样: time X Y Z
1 2018-10-12 0.3845284 -0.9836826 -1.0569133
2 2018-10-13 -1.3013479 -0.7696469 -0.2760410
3 2018-10-14 0.1635476 1.1942040 -1.2547790
4 2018-10-15 1.2628161 2.5839376 6.6017756
5 2018-10-16 1.4551718 -5.6564205 2.9474487
6 2018-10-17 0.1393586 1.1265156 -4.4762960
7 2018-10-18 -0.2038476 -2.3953796 0.3373139
8 2018-10-19 0.6941938 0.3539203 0.2740444
9 2018-10-20 -0.6756837 -0.5591505 4.0882947
10 2018-10-21 0.4185659 0.6060037 -5.8530951
先来看看gather的()用法。gather()是用来把错放在列的数据回归到行里的: library(tidyr)
data2 <- gather(data, category, value, X, Y, Z)
category是表头的东西放进行里之后叫的名字,value是原有的数据叫的名字,X,Y,Z则是我们想转换的列。 time category value
1 2018-10-12 X 1.673028459
2 2018-10-13 X -1.364111807
3 2018-10-14 X -0.014500001
4 2018-10-15 X -2.183752736
5 2018-10-16 X -0.436903127
6 2018-10-17 X -0.556745963
7 2018-10-18 X 0.290214951
8 2018-10-19 X -0.704078406
9 2018-10-20 X -0.223482208
10 2018-10-21 X -0.170426277
11 2018-10-12 Y 1.361510858
12 2018-10-13 Y 0.956045956
13 2018-10-14 Y 2.599511931
14 2018-10-15 Y -4.183381629
15 2018-10-16 Y 0.519890823
16 2018-10-17 Y 2.620015778
17 2018-10-18 Y -1.288184298
18 2018-10-19 Y -0.090887780
19 2018-10-20 Y 1.396205902
20 2018-10-21 Y -0.979669215
21 2018-10-12 Z 3.420684975
22 2018-10-13 Z -3.929318661
23 2018-10-14 Z -1.479456924
24 2018-10-15 Z 2.977001374
25 2018-10-16 Z 0.007312678
26 2018-10-17 Z 0.122019491
27 2018-10-18 Z -4.897137418
28 2018-10-19 Z 3.915128800
29 2018-10-20 Z -1.496445245
30 2018-10-21 Z 3.439804193
spread()做的事情和gather()刚好相反,它把行里的数据放到列里。 spread(data2, category, value)
就变回最开始data的样子了。 在gather的时候,有时我们想把所有的行都变过来,或者列数太多了,没办法一一specify,可以省略X,Y,Z。 直接用"-"来指示想要忽略哪些列,比如下面的语句和之前的gather是一样的效果: gather(data, category, value, -time)
我是觉得这两个函数有点难记的,也是写一写给自己整理一下思绪。总之要多看例子多用。
|