分享

长宽转换最通俗的教程

 脑系科数据科学 2020-05-30

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)

我是觉得这两个函数有点难记的,也是写一写给自己整理一下思绪。总之要多看例子多用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多