数据整理
原则就是让数据变得更好用。
数据整理是一个从数据框的统计结构(变量与观测)到形式结构(行与列)的映射。他只要遵循原则:
1.每一列代表一个变量。
2.每一行代表一个观测。
整理数据对ggplot2至关重要,因为ggplot2的任务就是将变量映射到视觉属性上。
spread 和 gather
下面两个表格
他们其实是相同的数据,只是形式不同。左侧是宽数据(Cartesian data,笛卡尔型数据),你要通过行与列的交叉点来找对应的值。右侧是长数据(indexed data,指标型数据),你要通过指标来找对应需要的数值。我们不能简单的说哪一个更优,因为两种形式都有可能是整洁的。
注意一点,在一个形式下明确存在的缺失值,可能在另一种形式下不存在。NA确实代表了一种缺失情况,但有时数值缺失单纯是因为那里没有值。
数据整理常常需要化宽为长,称为聚集gathering,但偶尔也需要化长为宽,称为扩散spreading。tidyr包分别提供了gather()函数和spread()函数来实现以上操作。
还可以扩展到更高维的情况,但是由于数据总是用二维储存的(行与列),所以这些扩展有趣但不实用。
gather
gather()函数有四个主要参数:
- data:需要调整的数据集;
- key:存放原来各列名的新变量的变量名;
- value:存放原来单元格中的值的新变量的变量名;
- …:指定的要聚合的变量。这里可以通过枚举进行指定,A,B,C,D,或者通过范围进行指定:A:D。还可以通过用 -号指定不需要聚集的列:-E,-F。
为了让数据更好用,我们还可以增加两个另外的参数:
convert = TRUE,na.rm = TRUE
conver = TRUE 将变量从字符串变成数值型,na.rm = TRUE 则可以自动移除没有值的月份。(其实这个缺失值并不是数据的丢失,而只是因为那个时间还没有到而已。)
spread
spread()函数是gather()的逆运算,你可以将数据化长为宽。它同样有gather()函数的几个参数。你需要指定需要转换的data,以及key和value对应的列名。
separate 和unite
spread和gather函数可以帮你解决数据中的变量放错位置的问题。而separate(分离)和unite(合并)则是为了解决以下问题:多个变量挤在了同一个列中。
separate()函数可以轻而易举地将这一混杂的列拆分成多个变量,它包含了以下四个主要参数:
- data:需要调整的数据框;
- col:需要进行拆分的列的列名;
- into:拆分后新生成变量的列名,格式为字符型向量;
- sep:对如何拆分原变量的描述,其可以是正则表达式,如_表示通过下划线拆分,或[^a-z]表示通过任意非字母字符拆分,或一个指定位置的整数。
如果变量被一种更复杂的形式混合在了一起,试试extract()函数。
另外,有时可能需要单独建立一列经由某种运算生成的变量,mutate()函数是一种方法。
unite()函数是separate()的逆运算——它可以将多列合并为一列。
举个实例:
ss_kpi_bymonth()%>%
select(1:2,10:13)%>%
gather(key = type,value = avg_price,"客单价","升舱客单价","到期客单价","提前续费客单价") %>%
spread(mm,avg_price) %>%
arrange(type)