《R语言数据分析》——3.2 聚集

简介:

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

3.2 聚集

最直接的数据汇总方法应该是调用stats包的aggregate函数,该函数能支持以下我们期望的功能:通过分组变量将数据划分成不同的子集,并分别对这些子集进行统计汇总。调用aggregate函数的最基本方法之一是传递待聚集的数值向量,以及一个因子变量,该因子变量将定义参数FUN的值,以确定划分函数。下面的样例中,我们以每个工作日航班平均转飞率作为划分依据:

QQ_20170525131158

当然,我们需要一定时间来执行上述分析,不过别忘了我们刚刚处理的是将近25万行数据,以分析2011年从休斯顿机场出发的航班日均转非率。

换句话说,这个结果对那些没有纳入日均转飞率统计的数据一样有意义,例如,从结果可知,一周中周三、周四这两天的航班转飞率(0.3%左右)比周末的航班转飞率(0.25%左右)更高一些,至少从休斯顿机场出发的航班是这种情况。

另外一种类似调用上述函数的方法是使用with函数,使用with函数的语法看起来更容易理解一些,因为在with函数里,我们不用重复地引用hflights数据库:

QQ_20170525131203

执行结果因和上一种方法完全一致就不再重复显示了。从aggregate函数的指南(参见?aggregate)可知其返回结果比较容易理解。不过,如果要从结果中查看返回数据列名并不容易?我们可以通过使用公式化的标记而不是像之前样例那样采用直接定义数值和因子变量的方法来解决这个问题:

QQ_20170525131211

使用公式化标记的好处是两方面的:

输入的字符相对较少

结果中显示的行名称是正确的

函数执行的结果相对之前的函数调用方法要更快一点,请参考3.3节相关内容。

使用公式化标记的唯一不利因素就是我们必须首先掌握这种方法,尽管该方法乍看起来稍显笨拙,但由于很多R函数和包都可以运用这种标记方式,特别是在定义模型的时候,因此毫无疑问从长远角度出发有必要了解好掌握该方法。

公式化标记是从S语言继承下来的,常见语法形式为:response_variable~predictor_variable_1 + … + predictor_variable_n。该标记也包括一些其他记号,例如用“-”去掉变量,用“:”或“*”来包含变量间的相互作用。参见本书第5章建模(由Renata Nemeth和Gergely Tot授权阅读),以及在R控制台使用?formula命令获得更多细节内容。

3.2.1 使用基础的R命令实现快速聚集

还可以通过调用函数tapply或函数by来实现数据聚集,这些方法可以在一个不规则的矩阵上应用R函数。这也意味着我们能够提供一个或多个INDEX变量,这些变量能被强制转换为因子,然后,将相关R函数分别应用于每个数据子集的所有单元上。下面是一个简单的样例说明:

QQ_20170525131215

请注意函数tapply返回的是一个array对象,而不是常见的数据框对象。换句话说,也即该函数的执行速度比前面介绍过得的函数都要快。因此,首先使用tapply函数完成计算过程,再将结果增加合适的列名转换为data.frame对象是可行的。

3.2.2 方便的辅助函数

上述转换过程可以很容易地以一种用户容易理解的方式完成,例如,plyr包(dplyr包更常见的一种形式)就是为数据框开发的特殊plyr版本(plyr specialized for data frames)。

plyr包提供了非常多的函数来处理data.frame、list或array类型的对象,返回结果也支持以上各种数据类型。这些函数的命名规则非常容易记忆:函数名的第一个字符代表输入数据的类别,第二个字符代表输出格式,所有的情况都以ply结尾。除了前面提到的三种R数据类型,还存在一些特殊的字符定义:

d代表data.frame

s代表array

l代表list

m为一种特殊的输入类型,它意味着我们以表格方式为函数提供了多个参数

r代表函数希望输入一个整数,以指明函数将要复制的次数

_是一种特殊的输出类型,此时函数将不返回任何结果

以下最常见的组合分别代表着:

ddply以data.frame为输入,返回也为data.frame

ldply以list为输入,返回data.frame

l_ply不返回任何结果,但是在某些情况下非常有用。例如,基于一定元素递归而不使用for循环;作为.progress参数,可以获得当前迭代状态以及剩余时间。

可以在本书第4章找到更多关于plyr包的样例以及用户案例。本章,我们仅关注用该包完成数据统计。接下来,我们将在所有样例中使用ddply(不要与dplyr包混淆)包:采用data.frame框架作为输入参数,返回数据也是data.frame类型。

装载包,并将mean函数作用于由DayofWeek划分的数据子集的Diverted列:

QQ_20170525131219
QQ_20170525132405

plyr包的.函数为用户提供了一种方便的引用变量(名称)的方法。否则,ddply包将采用其他方式来解释DayofWeek列的内容,导致错误。

这里要说明的重要一点是ddply比之前我们用过的aggregate函数速度更快。但从其他方面而言,我对这个结果还并不十分满意,输出结果使用了V1这样的列名,让我有些受不了。这里我们不再进行更新data.frame的名称这样的再加工,而是调用summarise辅助函数来替代上面用的匿名函数,然后再显式指定相应的列名:

QQ_20170525131224

好了,看起来像样多了,不过我们还能做得更好吗?

3.2.3 高性能的辅助函数

Hadley Wickham是ggplot、reshape和其他一些R开发包的作者,自2008年起开发了plyr包的第二代也可以说是特定版本。最基本的起因在于plyr包经常被用于将一类data.frame数据转换成另一类data.frame数据,因此对它的应用需要特别小心。dplyr包是专门针对数据框应用开发的plyr定制版,实现速度更快,开发语言为C++,dplyr包还支持远程数据库。

不过,函数执行效率还是根据具体情况不同而变化。例如,dplyr包的语法与plyr包相比,就有非常大的改变。尽管前面提到的summarise函数在dplyr包里也可以使用,但dplyr包中已经没有单独的ddplyr函数,在dplyr包中所有的函数都是以plyr::ddplyr的组件身份执行的。

无论如何,为了不让理论知识太过复杂,如果希望对某个数据集的子集进行汇总,我们首先要在聚集操作之前定义好分组:

QQ_20170525131229

结果对象和data.frame非常类似,只有一点不同:元数据将根据属性的平均值合并到对象中。为了让输出结果短一点,我们不会展示对象的整个数据结构(str),只显示其属性:

QQ_20170525131342

从输出的元数据可知,属性indicies很重要,它包含了每周中每天记录的ID,这样接下来的操作就能很容易地从整个数据集中选择所需的子集。下面,让我们看一下通过使用dplyr包的summairse函数而非plyr在提高操作性能后,转飞航班的比率:

QQ_20170525131350

结果差不多,哪个更好呢?读者们有没有比较两种方法执行时间的差别?鉴于这些细微的差别,我们知道dplyr包效率更好。

3.2.4 使用data.table完成聚集

读者们还记得[.data.table的第二个参数吗?我们称之为j,该参数包含了一个SELECT或UPDATE功能的SQL语句,其最重要的特性就是支持R表达式。因此,我们可以不使用函数,而是借助by参数来实现分组。

QQ_20170525131353

如果不希望采用V1来为结果表格的第二列数据命名,可以将summary对象指定为一个命名list,例如,hf?lights_dt[, list('mean(Diverted)'= mean(Diverted)), by = DayOfWeek],我们可以使用符号“.”而非list,就像在plyr包中的方法一样。

除了将结果按期望顺序排序,在现有键值列上进行数据统计速度也相对较快,下面我们将用一些实际案例对此进行说明。

相关文章
|
数据可视化 数据挖掘
R语言生存分析数据分析可视化案例(下)
R语言生存分析数据分析可视化案例
|
7月前
|
SQL 数据可视化 IDE
SQL做数据分析的困境,查询语言无法回答的真相
SQL 在简单数据分析任务中表现良好,但面对复杂需求时显得力不从心。例如,统计新用户第二天的留存率或连续活跃用户的计算,SQL 需要嵌套子查询和复杂关联,代码冗长难懂。Python 虽更灵活,但仍需变通思路,复杂度较高。相比之下,SPL(Structured Process Language)语法简洁、支持有序计算和分组子集保留,具备强大的交互性和调试功能,适合处理复杂的深度数据分析任务。SPL 已开源免费,是数据分析师的更好选择。
|
监控 安全 数据可视化
R语言在员工上网行为监控中的数据分析
本文讲述了如何使用R语言分析员工上网行为以提升企业网络安全。通过收集网络流量和访问记录数据,利用R进行读取、分析和可视化,例如查看访问时长分布和热门网站。此外,文中还介绍了一个自动将监控数据提交到网站的R脚本,通过定时任务实现数据的持续更新和管理,及时发现并应对安全风险,增强网络安全性。
396 3
|
数据可视化 前端开发 数据挖掘
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享(上)
R语言对综合社会调查GSS数据进行自举法bootstrap统计推断、假设检验、探索性数据分析可视化|数据分享
|
11月前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
235 2
|
11月前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
323 2
|
数据采集 算法 搜索推荐
R语言营销数据分析:使用R进行客户分群的实践探索
【9月更文挑战第1天】R语言以其强大的数据处理和统计分析能力,在金融数据分析、营销数据分析等多个领域发挥着重要作用。通过R语言进行客户分群,企业可以更好地理解客户需求,制定精准的营销策略,提升市场竞争力和客户满意度。未来,随着大数据和人工智能技术的不断发展,R语言在营销数据分析中的应用将更加广泛和深入。
|
机器学习/深度学习 数据可视化 数据挖掘
为啥我敢说Python是数据分析界的扛把子语言?
为啥我敢说Python是数据分析界的扛把子语言?
138 1
|
SQL 数据可视化 数据挖掘
SQL 在数据分析中简直太牛啦!从数据提取到可视化,带你领略强大数据库语言的神奇魅力!
【8月更文挑战第31天】在数据驱动时代,SQL(Structured Query Language)作为强大的数据库查询语言,在数据分析中扮演着关键角色。它不仅能够高效准确地提取所需数据,还能通过丰富的函数和操作符对数据进行清洗与转换,确保其适用于进一步分析。借助 SQL 的聚合、分组及排序功能,用户可以从多角度深入分析数据,为企业决策提供有力支持。尽管 SQL 本身不支持数据可视化,但其查询结果可轻松导出至 Excel、Python、R 等工具中进行可视化处理,帮助用户更直观地理解数据。掌握 SQL 可显著提升数据分析效率,助力挖掘数据价值。
529 0
|
机器学习/深度学习 数据挖掘 计算机视觉
R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告
R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告