《机器学习与数据科学(基于R的统计学习方法)》——2.11 R中的SQL等价表述

简介:

本节书摘来异步社区《机器学习与数据科学(基于R的统计学习方法)》一书中的第2章,第2.11节,作者:【美】Daniel D. Gutierrez(古铁雷斯),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.11 R中的SQL等价表述

使用类似于SQL的功能,R有很多种方法能够连接保存在数据框中的数据集。如果你已经了解SQL,那么理解和SQL命令具有相同功能的、R用来操作数据的工具将会是很有用的。在本节中,我们将看到一些在连接数据时早晚会派上用场的工具。为了对这些工具进行举例说明,我们将使用在基础R系统里即可获得的CO2数据集。让我们看看这个数据集的结构和内容:

> data(CO2)
> head(CO2)
   Plant  Type     Treatment     conc   uptake
1  Qn1    Quebec   nonchilled    95     16.0
2  Qn1    Quebec   nonchilled    175    30.4
3  Qn1    Quebec   nonchilled    250    34.8
4  Qn1    Quebec   nonchilled    350    37.2
5  Qn1    Quebec   nonchilled    500    35.3
6  Qn1    Quebec   nonchilled    675    39.2```
这个CO2数据集包含了84条观测值和5个变量:Plant、Type、Treatment、conc和uptake。通常,你要对数据集做的第一件事是基于一个过滤器筛选数据行。

SELECT * FROM CO2 WHERE conc>400 AND uptake>40`
R中的等价表述使用了下面这种简单的语法:

CO2_subset <- CO2[CO2$conc>400 & CO2$uptake>40,]
head(CO2_subset)
    Plant  Type     Treatment     conc   uptake
12  Qn2    Quebec   nonchilled    500    40.6
13  Qn2    Quebec   nonchilled    675    41.4
14  Qn2    Quebec   nonchilled    1000   44.3
19  Qn3    Quebec   nonchilled    500    42.9
20  Qn3    Quebec   nonchilled    675    43.9
21  Qn3    Quebec   nonchilled    1000   45.5
> dim(CO2_subset)  # 8 observations selected
[1] 8 5```
然后,我们将看一条SQL SELECT语句的ORDER BY子句。在这里,我们希望将结果集根据变量conc进行排列(升序序列),然后根据变量uptake进行排列(降序序列)。下面是SQL的表述:

SELECT * FROM CO2 ORDER BY conc, uptake DESC`
R中的等价表述使用了下面这种简单的语法。我已经加了一些附加的R语句将结果限制在前20行,但是这只是为了方便起见,因为我们不想在这里展示CO2数据集全部的84行观测值。

> CO2[order(CO2$conc, -CO2$uptake),][1:20,]
    Plant  Type         Treatment     conc   uptake
15  Qn3    Quebec       nonchilled       95     16.2
1   Qn1    Quebec       nonchilled        95     16.0
36  Qc3    Quebec       chilled           95     15.1
22  Qc1    Quebec       chilled           95     14.2
8   Qn2    Quebec       nonchilled        95     13.6
50  Mn2    Mississippi  nonchilled       95     12.0
57  Mn3    Mississippi  nonchilled       95     11.3
43  Mn1    Mississippi  nonchilled       95     10.6
78  Mc3    Mississippi  chilled          95     10.6
64  Mc1    Mississippi  chilled          95     10.5
29  Qc2    Quebec       chilled           95     9.3
71  Mc2    Mississippi  chilled          95     7.7
16  Qn3    Quebec       nonchilled        175    32.4
2   Qn1    Quebec       nonchilled        175    30.4
9   Qn2    Quebec       nonchilled        175    27.3
30  Qc2    Quebec       chilled           175    27.3
23  Qc1    Quebec       chilled           175    24.1
51  Mn2    Mississippi  nonchilled       175    22.0
37  Qc3    Quebec       chilled           175    21.0
58  Mn3    Mississippi  nonchilled       175    19.4```
另一个强大的SQL结构是GROUP BY子句,用来计算聚合值,例如平均值。在这种情况下,我们想要计算每个不同的Plant值对应的uptake的平均值。下面是完成这个是SQL表述:

SELECT Plant, AVG(uptake) FROM CO2 GROUP BY Plant`
R中的等价表述基于aggregate函数,使用了下面的语法来主导处理过程。第一个自变量x,对于aggregate()来说是CO2[,c(“uptake”)],将uptake这一列从CO2的数据框中分离出来。第二个变量by,是data.frame(CO2$Plant),是一个组变量。最后,R函数中的FUN变量用于计算摘要统计量,在这个例子中,代表的是mean。

> aggregate(x=CO2[,c("uptake")], by=data.frame(CO2$Plant), FUN="mean")
     CO2.Plant    x
1    Qn1          33.22857
2    Qn2          35.15714
3    Qn3          37.61429
4    Qc1          29.97143
5    Qc3          32.58571
6    Qc2          32.70000
7    Mn3          24.11429
8    Mn2          27.34286
9    Mn1          26.40000
10   Mc2          12.14286
11   Mc3          17.30000
12   Mc1          18.00000```
我们将举一个如何用R做SQL多表查询的例子来结束讨论。考虑这样一种情况:你想从一张标注了州和省的次表中查找国家。下面是完成这个任务的SQL语句:

SELECT c.Type,
c.Plant,
c.Treatment,
c.conc,
c.uptake,
g.country
FROM geo_map g
LEFT JOIN CO2 c ON(c.Type = g.Type)`
R中的等价表述使用了下面这种基于merge()函数的语法。看看CO2数据集中的前几行观测数据,我们了解到变量Type中包含了植物最初生活的州或省。我们使用这个变量作为通用的键值。下一步,我们将创建一个新的数据框geo_map,它会扮演将国家和州/省配对的查找表的角色。然后,在为geo_map设定了合适的列名之后,使用merge()来生成和SQL多表查询得到的相同的结果集joinCO2。注意新的数据框含有一个变量country,它是基于Type的查找值。这和SQL多表查询有相同的效果。

> head(CO2)
   Plant  Type    Treatment    conc    uptake
1  Qn1    Quebec  nonchilled   95      16.0
2  Qn1    Quebec  nonchilled   175     30.4
3  Qn1    Quebec  nonchilled   250     34.8
4  Qn1    Quebec  nonchilled   350     37.2
5  Qn1    Quebec  nonchilled   500     35.3
6  Qn1    Quebec  nonchilled   675     39.2

> stateprov <- c("Mississippi", "California", "Victoria",   
"New South Wales", "Quebec", "Ontario")
> country <- c("United States", "United States", "Australia", "Australia", "Canada", "Canada")

> geo_map <- data.frame(country=country, stateprov=stateprov)
> geo_map
    country         Type
1   United States   Mississippi
2   United States   California
3   Australia       Victoria
4   Australia       New South Wales
5   Canada          Quebec
6   Canada          Ontario

> colnames(geo_map) <- c("country", "Type")
> joinCO2 <- merge(CO2, geo_map, by=c("Type"))
> head(joinCO2)
  Type        Plant Treatment   conc   uptake  country
1 Mississippi  Mn1    nonchilled  95     10.6     United States
2 Mississippi  Mn1    nonchilled  175    19.2     United States
3 Mississippi  Mn1    nonchilled  250    26.2     United States
4 Mississippi  Mn1    nonchilled  350    30.0     United States
5 Mississippi  Mn1    nonchilled  500    30.9     United States
相关文章
|
1月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
103 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
276 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
2月前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
133 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
3月前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
205 71
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
72 6
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
196 6
|
3月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
253 1
|
3月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
69 0
|
3月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
111 4
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习