基于R语言的统计分析基础:使用SQL语句操作数据集

在使用R语言数据分析时,可以融合SQL语言使数据聚集操作更加便利,同时也可以增加对SQL语句的熟悉。借助sqldfDBIRSDLite等包,可以在R环境中直接运用SQL语句,轻松实现数据的分组统计、汇总分析,SQL的强大查询能力简化了数据处理步骤,让复杂分析变得简单。

举个例子,使用DBI包操作R语言自带数据集USArrests

r 复制代码
library(DBI)  
# 初始化一个临时的内存数据库并将一个data.frame复制到其中  
con <- dbConnect(RSQLite::SQLite(), ":memory:")  
data(USArrests)  
dbWriteTable(con, "USArrests", USArrests)  
dbListTables(con)  
  
# 将所有查询结果提取到一个data frame中  
dbGetQuery(con, "SELECT * FROM USArrests")  
  
# 或者分批进行  
rs <- dbSendQuery(con, "SELECT * FROM USArrests")  
d1 <- dbFetch(rs, n = 10)  # 以10行为单位提取数据  
dbHasCompleted(rs)  
d2 <- dbFetch(rs, n = -1)  # 提取所有剩余数据  
dbHasCompleted(rs)  
dbClearResult(rs)  
  
# 清理  
dbDisconnect(con)

安装sqldf包和RSQLite

在进行操作前需要先安装sqldf包和RSQLite

r 复制代码
install.packages("sqldf")  
install.packages("RSQLite") 

随后在脚本或命令行中导入这两个包:

r 复制代码
library(sqldf)  
library(RSQLite) 

sqldf包函数参数说明

参数名称 描述
x SQL 查询语句,可以是单个字符串或字符串向量。如果 x 缺失,则建立一个数据库连接,后续 sqldf 语句将使用这个连接。
stringsAsFactors 是否将字符型列转换为因子类型。
row.names 是否为数据框添加行名列。
envir 指定查找数据框的环境。
method 指定输出数据框的列类型转换方式。
file.format 用于读取文件到数据库的参数设置。
dbname 数据库名称,对于 SQLite 和 h2 默认是 :memory:,表示嵌入式数据库。
drv 指定数据库驱动,如 "SQLite", "MySQL", "h2", "PostgreSQL"
user, password, host, port 数据库连接的用户名、密码、主机和端口。
dll SQLite 可加载扩展的名称。
connection 指定已存在的数据库连接。
verbose 是否显示详细输出。

使用案例

1.创建数据库文件

这里我将R语言自带的iris数据集制作成.sqlite文件,在制作.sqlite文件时需要注意下,要将列命"Sepal.Length"更改为"Sepal_Length"格式,方便数据库操作。

r 复制代码
library(RSQLite)   
# 创建SQLite数据库连接  
data("iris") 
names(iris) <- c("Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width", "Species")
con <- dbConnect(RSQLite::SQLite(), dbname = "iris.sqlite")  
# 将iris数据集复制到数据库中的新表  
dbWriteTable(con, "iris_table", iris)  
# 关闭数据库连接(个人推荐每次在脚本结束时关闭连接)  
dbDisconnect(con)  

代码运行成功后会在工作目录中生成.sqlite文件和.sqlite-journal文件

2.查询表中数据

这里,使用刚才建立的iris.sqlite,数据库驱动为 SQLite,并使用 sqldf 函数执行了一个简单的 SQL 查询,即选择 iris 表中的所有列和行。查询结果存储在 iris_query_from_db 数据框中,随后被打印出来。

r 复制代码
library(RSQLite)   
library(sqldf)
# 创建SQLite数据库连接  
con <- dbConnect(RSQLite::SQLite(), dbname = "iris.sqlite")  
# 将iris数据集复制到数据库中的新表  
dbWriteTable(con, "iris_table", iris)  
# 关闭数据库连接(个人推荐每次在脚本结束时关闭连接)  
dbDisconnect(con)  
iris_query_from_db <- sqldf("SELECT * FROM main.iris_table WHERE Species = 'setosa'", dbname = "iris.sqlite")
# 打印结果
print(iris_query_from_db)
3.查询列名

先通过PRAGMA table_info命令从数据库中检索iris_table表的列信息。检索到的信息存储在一个数据框column_names中,随后提取column_names数据框中的name列,并将其转换为字符向量column_names_list,最后打印出这个列名列表。

r 复制代码
column_names <- sqldf("PRAGMA table_info(iris_table);", dbname = "iris.sqlite")  
column_names_list <- as.character(column_names$name)  
print(column_names_list)
4.查询前几条记录

这里仍使用刚才创建的数据库文件,只查询前6行

sql 复制代码
iris_first_few <- sqldf("SELECT * FROM main.iris_table LIMIT 5", dbname = "iris.sqlite") 
iris_first_few 
5.插入数据

先创建了一个包含新数据的数据框new_row,然后,使用dbExecute函数和参数化查询将新数据插入到iris_table表中,参数化查询可以帮助防止SQL注入攻击,并提高查询的安全性。

r 复制代码
new_row <- data.frame(  
  Sepal.Length = 5.9,  
  Sepal.Width = 3.0,  
  Petal.Length = 5.1,  
  Petal.Width = 1.8,  
  Species = "virginica"  
)  
dbExecute(con, "INSERT INTO iris_table (Sepal_Length, Sepal_Width,
			 Petal_Length, Petal_Width, Species) VALUES (?, ?, ?, ?, ?)",  
          params = list(5.9, 3.0, 5.1, 1.8, "virginica"))  
6.数据筛选

这里筛选出Petal_Width 为0.2的所有数据

sql 复制代码
iris_petal_width_0_2 <- sqldf("SELECT * FROM main.iris_table WHERE Petal_Width = 0.2", dbname = "iris.sqlite")
iris_petal_width_0_2
7.数据聚合

通过sqldf()函数执行一个SQL查询,该查询从iris表中选取每个物种(Species),并计算其平均花萼长度(Sepal_Length)和花萼宽度(Sepal_Width)。查询结果存储在一个数据框ass中,

sql 复制代码
ass <- sqldf('SELECT Species, AVG("Sepal_Length") AS Sepal_Length, 
             AVG("Sepal_Width") AS Sepal_Width FROM iris GROUP BY Species')
ass
8. 多表连接

先创建两个数据框DF1DF2,它们分别包含IDValue列以及IDDetail列。然后通过sqldf函数执行一个SQL左连接查询,将DF1DF2ID列进行连接。查询结果包含DF1的所有列以及DF2中的Detail列,当ID匹配时,Detail列显示相应值,否则显示NA。查询结果存储在一个数据框result中,并打印出来以供查看。

sql 复制代码
# 建立两个数据框 DF1 和 DF2
DF1 <- data.frame(ID = 1:5, Value = 10:14)
DF2 <- data.frame(ID = 3:7, Detail = letters[1:5])
# 使用 SQL 进行连接查询
result <- sqldf("SELECT DF1.*, DF2.Detail FROM DF1 LEFT JOIN DF2 ON DF1.ID = DF2.ID")
result

最后切记有个好习惯,关闭数据库连接

r 复制代码
dbDisconnect(con)
相关推荐
zwjapple10 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five11 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
前端每日三省13 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
gma99920 分钟前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️22 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
凡人的AI工具箱26 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
chnming198742 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙43 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂43 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc1 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python