本节书摘来自华章出版社《R语言数据挖掘:实用项目解析》一书中的第1章,第1.4节排序与合并数据框,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区“华章计算机”公众号查看
1.4 排序与合并数据框
在做数据管理时,排序与合并是两个重要概念。它们的操作对象可以是单一向量或者是一个数据框,还可以是一个矩阵。R语言中的sort()用于对向量进行排序。降序命令选项可用以改变排序的方向(升序或降序)。在处理像ArtPiece.csv这样的数据框时,用order命令对数据进行排序,可以设置多个变量是升序还是降序。如要执行降序,可以在一个变量名前加一个负号。下面利用一个数据集来阐释R语言中的排序概念,代码如下:
ArtPiece数据集里有16个变量:10个数值变量和6个分类变量。使用names命令可输出数据集中所有变量的名字。借助attach函数,当前R会话中的所有变量名都会保存下来,用户就不需要每次在输入变量名时在前面加上数据名:
排序默认采用升序排列,如果想对向量进行降序排列,则需要在排序的变量名前加一个负号。如下所示,变量Critic.Ratings也可以以降序排列。要以降序排列,命令中的decreasing需要设置成True:
除了对单个数值向量排序,大多数时候数据集需要按一些输入变量或数据框中的当前属性进行排序。对单个变量排序和对数据框排序有很大不同。下面的代码演示了如何使用order函数对数据框排序:
如上面的代码所示,变量Critic.Ratings和Acq. Cost以升序排列,使用的是order命令而非sort命令。head命令默认输出有序数据的前6条记录。order命令中的第二个参数1∶5表明我们想要输出ArtPiece数据集前6条记录的前五个变量。如果需要输出前10条记录,可以执行head(i2, 10)。这个数据集没有缺失值,但需要注意的是,实际数据中是存在缺失值(NA)的。而在有缺失值(NA)时,数据框的排序会变得比较棘手。假使将数据集中的任意NA值纳入考虑,order命令会产生以下结果:
NA.LAST命令用于将缺失值(NA值)从数据集中分离开来——它们会被放到数据集的末尾(如果NA.LAST是TRUE),或是数据集的开头(如果NA.FAST是FALSE)。在order函数中分离出NA值可以保证数据的完整性。
merge函数用于合并两个数据框。要合并两个数据框,前提是它们至少有一列是同名的。两个数据框也可以通过列合并函数合并。为了显示列合并函数和merge函数的区别,我们以audit.CSV数据集作为例子。现有从audit数据集中抽取的两个小数据集A和B:
以ID和Employment这两列作为数据集A和B的公共列,可以以此作为合并两个数据框的主键。使用merge命令,共有列将在merge函数的输出数据集中出现一次。合并的数据框包含了两个数据框的所有行:
merge函数提供4种合并数据的方法:自然连接、全外部连接、左外部连接和右外部连接。除了这些连接外,两个数据框还可以基于任何指定的单列或多列进行合并。自然连接只保留两个数据框合并时匹配上的行,可用参数all=F设定:
全外部连接让我们可以保留两个数据框的所有行,这可用all=T命令指定。它执行全合并,并用NA值补全两个数据框中都没有匹配数据的列。merge函数默认会除去两个数据框中所有不相匹配的记录。若要在新数据框中保留所有记录,则需要设定all=T:
左外部连接将包含数据框1(A)的所有行和数据框2(B)中连接匹配上的行。若要完成左外部连接,则需要规定all.x=T:
右外部连接将包含数据框B的所有行和数据框A中连接匹配上的行。若要完成右外部连接,则需要规定all.y=T:
在数据框A和B中,有两个公共列,即ID和Employment。使用merge函数时,如果选择按单个公共列合并,那么另一个公共列也会出现在输出数据框中。如果合并多个数据框,多重的列将不会出现在输出数据框中:
在两个数据框至少有一个共同列时,merge函数是有用的。如果两个数据框都包含不重叠的列或者两个数据框没有共同列,可使用column bind函数合并两个数据框。column bind函数输出数据框A和数据框B中的所有列且将其并排排列。