《R语言数据分析》——第3章 数据筛选和汇总 3.1 去掉多余的数据

本节书摘来自华章出版社《R语言数据分析》一书中的第3章,第3.1节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问“华章计算机”公众号查看。

第3章

数据筛选和汇总

当我们从平面文件或数据库(第1章),或直接通过某些API从Web(第2章)完成数据导入后,在开始实际的数据分析操作之前,经常会有必要对原始数据展开聚集、转换及筛选操作。

本章,我们将关注以下内容:

对数据框对象进行行或列筛选

对数据进行汇总和聚集

除了基础的R方法,掌握通过dplyr和data.table等包来优化数据预处理操作的性能

3.1 去掉多余的数据

尽管提前去掉多余数据能实现性能优化(参考1.3节以及1.4节),我们仍然会面临对已经导入到R的原始数据集进行筛选的需求,可以借助subset、which和[或[[操作符等R自带的传统工具和函数来完成这一任务,也可以使用sqldf包中类似SQL语句的方法,例如:


我相信那些具有相当SQL基础,并刚刚开始了解R的读者会很喜欢使用这种替代的数据筛选方法,不过我个人建议使用下面这一类似,但更自然和简洁的R版本:

两个结果之间存在些许差别,这是由于sqldf的row.names参数默认为FALSE,在执行时为了获得完全相同的结果,可重置该参数:

上述样例着重介绍了如何从data.frame对象中去掉不需要的行,但如果我们希望去掉其中部分列又该怎么办呢?

采用SQL方法来处理这个问题非常简单,只需要在SELECT语句中指明需要去掉的列而不使用*符号即可。另外,subset也可以通过改变select参数的值来实现这个功能,可以用向量或R表达式来填写select参数,例如,指明列的范围:

还可以将未加引号的列名作为向量代入函数c实现按给定顺序选择一个随机的列表,或者使用-符号来指定列名。例如,subset(mtcars, select = -c(hp, wt))。

接下来我们将探讨在处理一些大数据集时,如何集中利用前面介绍的筛选方法,以弥补使用基础的R函数不能解决的性能问题。

3.1.1 快速去掉多余数据

在数据集的大小不超过实际物理内存时,R处理的效率最高,有不少R包都针对这样的数据集提供了非常快捷的访问方法。

一些测试平台(参见本书附录)给出了比部分开源(例如MySQL、PostgreSQL和Impala)以及商业数据库(例如HP Vertica)所提供效率更高的R统计函数及其实际应用。

在第1章中我们已经探讨部分相关的开发包,并介绍了从hf?lights包读入相当数量的数据到R会话的过程。

以下样例将展示在该数据集上对大约25万行数据进行处理的过程:

看起来函数base::subset的处理结果比较好,不过我们还能不能再提高处理的效率呢?plyr包的第2代dplyr包(该开发包的相关细节将在本章3.2.3节以及本书第4章进行探讨),为常用数据库操作方法提供速度奇快的C++版本,使用方法更直观:

更进一步地,我们还可以像之前调用subset函数一样,使用该开发包从数据集中去掉一些列。不过,这里将调用select函数而不是传递一个同名参数:

看起来执行的结果更像是调用了f?ilter函数而非subset函数,并且眨眼之间命令就已执行完成!dplyr包可以处理传统的data.frame以及data.table对象,也可以直接与最常用的数据引擎进行交互。需注意的是,行的名称在dplyr包的结果中不予保留,因此如果读者需要用到这些信息,最好在使用dplyr包处理数据之前将它们复制到一个显式变量或如下所示的data.table对象中:

3.1.2 快速去掉多余数据的其他方法

下面我们不使用dplyr包,而是直接利用data.table包自己的方法来解决同样的问题。

data.table包提供了一种基于列自动索引的内存数据结构方法来处理大型数据集,对传统的数据框方法提供向下兼容。

当完成包的装载后,我们需要把hf?lights的传统data.frame对象转换为data.table。再创建一个名为rownames的新列,并将原始数据集的这个新列,通过:=赋值符号,指定到data.table:

我们还需花些时间来熟悉定制的data.table语法,传统的R用户首次接触该开发包时可能有点不习惯,但是从长远来看还是应该了解该开发包。在花费一定时间了解最初的一些样例后,我们能够通过它获得非常好的处理性能,其语法也更符合R的特点。

事实上,data.table的语法和SQL非常类似:

等同如下的SQL语句:

[.data.table(代表应用到data.table对象的操作符)与传统[.data.frame语法相比,使用了不同的参数,如上述样例所示。

此处,我们不会对赋值操作符进行详细探讨,因为作为本书的一个介绍性章节,解释这样一个样例实在太难了,我们还是从比较简单的地方开始着手。因此,更多详细内容请参考本书第4章,或者输入?data.table获得帮助。

因此,?data.table操作符的第一个参数(i)应该代表筛选,或者换句话说,有点像SQL语句中的WHERE子句,而[.data.frame指定了从原始数据集中去掉的行。两个参数间的差别在于前者可以跟任意R表达式,而后者是传统的处理方法,只能跟整数或逻辑值。

无论如何,筛选就和传递一个R表达式到data.table的“[”操作符中参数i一样容易。下面,我们将探讨如何使用data.table语法来选择列,基于上述讨论的通用data.table语法,应该放在第2个参数(j)中完成:

好了,现在我们拥有了包含符合预期的2个列的3481个观测值。此处,函数list被用来定义需要保留的列,尽管在[.data.frame中更常使用的是函数c (a的基本函数,可用于连接向量元素)。函数c也可以应用于[.data.table,但是必须要将变量名作为字符向量传递进去,并且将with参数设置为FALSE。

除了使用list,在plyr包里还可以使用“.”来代替函数名,例如:hf?lights_dt[, .(Dep-Time, ArrTime)]。

现在,我们已经或多或少了解了在一个活动的R会话中筛选数据的操作方法,也学习了dplyr以及data.table包的所有相关语法规则,下面我们将探讨如何使用这些方法来完成数据的聚集和汇总分析。

时间: 2024-08-31 02:02:23

《R语言数据分析》——第3章 数据筛选和汇总 3.1 去掉多余的数据的相关文章

《R语言数据分析》——第2章 从Web获取数据 2.1 从Internet导入数据集

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.1节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 第2章 从Web获取数据 实际项目中,经常会碰见所需数据不能从本地数据库或硬盘中获取而需要通过Internet获得的情况.此时,可以要求公司的IT部门或数据工程师按照下图所示的流程将原有的数据仓库扩展,从网络获取处理所需要的数据再倒入公司自己的数据库: 如果公司还没有建立ETL系统(抽取.转换装

《R语言数据分析》----第1章 你好,数据! 1.1 导入一个大小合适的文本文件

第1章 你好,数据! 大多数R项目都必须从数据导入到R的会话中开始,由于R语言能够支持多种文件格式和数据库后台,因此可以使用相当多的数据导入方法.本章,我们不会再讨论基础的数据结构,因为你应该已经对它们非常熟悉了.本章的重点将放在大数据集的导入以及处理一些特殊的文件类型. 如果读者希望对标准工具做一个粗略的回顾,复习一下普通类型数据导入的方法,可以参考官方有关CRAN介绍的手册,地址为:http://cran.r-project.org/doc/manuals/R-intro.html#Read

《R语言数据分析》——2.4 从其他在线来源获取数据

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.4节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 2.4 从其他在线来源获取数据 尽管readHTMLTable非常实用,但某些时候数据不是以结构化格式存放在表格中,更可能就是以HTML表形式存储.我们首先访问http://cran.r-project.org/web/views/WebTechnologies.html 来了解一下R包在相应的

《R语言数据分析》——2.3 从HTML表中读取数据

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.3节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 2.3 从HTML表中读取数据 万维网上传统的文本和数据以HTML页面为主,我们经常可以从例如HTML表找到一些有意思的信息,很容易就能通过复制和粘贴将数据转换成Excel电子表格,保存在磁盘上,稍后再导入到R中.但是这个过程比较费时间,也有点枯燥,因此可以考虑进行自动化处理. 可以借助前面提到

《R语言数据分析》——导读

前 言 自20多年前发源于学术界以来,R语言已经成为统计分析的通用语言,活跃于众多产业领域.目前,越来越多的商业项目开始使用R,兼之R用户开发了数以千计易于上手的开发包,都使得R成为数据分析工程师及科学家最常用的工具. 本书将帮助读者熟悉R语言这一开源生态系统,并介绍一些基本的统计背景知识,以及一小部分相关的数学知识.我们将着重探讨使用R语言解决实际的问题. 由于数据科学家在数据的采集.清洗及重构上将耗费大量时间,因此本书首先将通过第一手实例来重点探讨从文件.数据库以及在线资源中导入数据的方法,

《R语言数据分析》——3.5 小结

本节书摘来自华章出版社<R语言数据分析>一书中的第3章,第3.5节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 3.5 小结 本章,我们介绍了一些简单有效的应用于数据筛选和汇总的方法,也给出了筛选数据集行列数据的一些案例,并探讨了如何对数据进行汇总以进行进一步的分析.我们基本介绍完了绝大多数能够实现这些任务的最流行的方法,并在一个可重复的样例和测试平台上对这些方法的性能进行了比较. 在下一章节,我们将继续

《R语言数据分析》——2.5 使用R包与数据源API交互

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.5节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 2.5 使用R包与数据源API交互 尽管我们能够读取HTML表格.CSV文件.JSON和XML数据,甚至某些HTML的原始文档,然后实现数据的存储,但花太多时间用来开发我们自己的工具意义并不大,除非我们再没有其他选择.因此,通常我们应该首先快速了解清楚Web Technologies以及Serv

《R语言数据分析》——2.6 小结

本节书摘来自华章出版社<R语言数据分析>一书中的第2章,第2.6节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 2.6 小结 本章专注于如何直接获取并处理由Web得到的数据集,包括文件下载.XML和JSON格式数据的处理.HTML表的分析.使用XPath函数将数据从HTML页面中抽取出来以及如何与RESTful API进行交互. 尽管基于Socrata API实现的一些样例可以很简单地借助RSocrata

《R语言数据分析》——1.6 导入Excel电子表格

本节书摘来自华章出版社<R语言数据分析>一书中的第1章,第1.6节,作者盖尔盖伊·道罗齐(Gergely Daróczi),潘怡 译,更多章节内容可以访问"华章计算机"公众号查看. 1.6 导入Excel电子表格 在学术界和商业界,除了CSV文件,Excel的xls(或xlsx,最近的一种新称呼)应该是应用最为广泛的进行存储和交换少量数据最为通用的数据格式.它最初源自Microsoft公司独有的二进制文件格式,对其文档的说明非常多(xls指南长达1100页,50M),但是对