4.3.2 使用gather()和spread()函数实现长宽数据转换

4.3.2 使用gather()和spread()函数实现长宽数据转换

直观来说,使用gather()和spread()函数处理数据会改变数据框的长度和宽度,这也就是所谓的长宽转换。但从本质上讲,这两个函数改变的是数据表之间的连接关系,在某些情况下,这种改变有助于更好地理解数据。

gather()函数类似于Excel中数据透视的功能,它能把一个变量名含有变量的二维表转换成一个规范的二维表,我们可结合如下示例进行理解:

为了使数据更加直观,需要先将要转换的列筛选出来。select()函数是dplyr包的重要函数,用于选取数据框的列,后面会有相关介绍。上述代码的含义是:选取sales列到shipcost列的5列数据,并将其转换为attribute,value两列。sales在原数据中作为变量名,但是转换之后成了attribute列的变量,这就是前面提到的变量名含有变量的情况。需要注意的是,并不是所有变量进行长宽转换都具有实际意义,要具体问题具体分析。仔细观察代码块可以发现,%>%使代码变得十分简洁,读者可以思考一下,若不使用管道操作符,上述代码应怎样编写?

细心的读者会发现,gather()函数转化之后的数据比原数据具有更多的行,那么代码框中的gather()是如何起到作用的呢?观察下面的代码和代码输出的结果:

我们可以在RStudio中使用View(orders3)命令查看完整的数据框。可以发现的是,数据框中其他列的数据被保存,并且进行了复制,以适应数据框的长度变化。

gather()函数可将宽数据转换为长数据,而spread()函数则将长数据转换为宽数据。例如,使用spread()函数将刚刚合并的attribute列和value列拆分为原数据,具体代码如下: