本节书摘来自华章计算机《数据科学:R语言实现》一书中的第3章,第3.10节,作者 丘祐玮(David Chiu),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.10 重塑数据
重塑数据类似于创建列联表,它允许用户聚合特定值下的数据。reshape2程序包就是用来完成这个任务的。这里,我们会介绍如何使用reshape2程序包,借助函数dcast把长数据转换成宽数据。我们也会介绍如何使用函数melt把宽数据转换回长数据。
准备工作
按照3.8节“合并数据”教程,把employees和salaries融合为employees_salary。
实现步骤
执行下列步骤,重塑数据。
1.首先,我们可以使用函数dcast把长数据转换成宽数据:
2.我们也可以通过保留emp_no和格式化的名称字符串作为两个属性,来转换数据。然后我们可以设置薪水支付的年份作为列名,薪水作为它的值:
3.另外,我们可以使用函数melt把宽数据转换回长数据:
4.为了移除long_salaries中带有缺失值的数据,我们可以使用na.omit移除这些数据:
运行原理
在本教程中,我们展示了如何使用reshape2程序包重塑数据。首先,我们使用函数dcast把长数据转换为宽数据。使用这个函数时,我们指定了salaries作为转换时的第一个参数。然后,我们又设定emp_no作为行,薪水年份作为列,给定重塑函数。最后,我们设置salary作为宽数据中的值。
我们也可以使用多个列来重塑数据。我们只需通过+操作符,在公式的左边添加另一个列的信息。因此,在第2步中,我们设置employees_salary数据上的重塑公式形式为emp_no + paste(first_name,last_name) ~ year(ymd(from_date))。然后,我们看到输出数据的左边部分是emp_no和格式化的名称,薪水支付年份在右边部分,薪水作为值。
除了把长数据重塑为宽数据,我们也可以使用函数melt把宽数据转变回长数据。因此,我们可以使用emp_no作为基础,把wide_salaries重塑为长数据。由于我们有许多缺失值(表示为NA),可以使用na.omit移除这些数据。
更多技能
除了plyr程序包中的dcast和melt函数,我们还可以使用stack和unstack来分组数据和取消分组。
1.我们可以使用函数unstack按值分组数据:
2.相反,我们可以使用函数stack把多个数据框或列表拼接起来: