R中的Sqldf包学习

R中的Sqldf包学习

SQL功能强大,不仅能实现数据的清洗、统计、运算,还可以实现数据存储、控制、定义和调用。越来越多的公司在招聘的时候都要求数据分析师除了要掌握统计建模和数据挖掘的理论方法和编程能力外,还要求其具备使用sql的能力。鉴于SQL的重要性,很久之前就想学一学sqldf包了,奈何一直拖到现在。下面分享一下我的初步学习成果。

简要说明:
1 sqldf包是R扩展包,需要先安装后加载,才能使用。
2 使用sqldf函数,需要掌握SQL语句的写法。
3 sqldf的包,正如字面意思,就是按照SQL的方式来查询dataframe的内容。
一、包所涉及的重要函数
(1)用sql读取一个文件(read.csv.sql)
语法:
read.csv.sql(file=路径或者url, sql = “select * from file”, header = TRUE, sep = “,”)
示例:

write.csv(iris, "iris.csv", quote = FALSE, row.names = FALSE)
iris2 <- read.csv.sql("iris.csv",sql = "select * from file where Species = 'setosa' ")
iris2

(2)数据框的sql语句sqldf()
示例:
a1s <- sqldf(“select * from warpbreaks limit 6”)
二、接下来进行对比分析sql语句与R语言
(1)提取数据集的前六行观测

a1r <- head(warpbreaks)
a1s <- sqldf("select * from warpbreaks limit 6")
identical(a1r, a1s)  #结果为TRUE,则结果一致

(2)提取指定内容的数据集

a2r <- subset(CO2, grepl("^Qn", Plant))
a2s <- sqldf("select * from CO2 where Plant like 'Qn%'")
a

ll.equal(as.data.frame(a2r), a2s)
    
     
data(farms, package = "MASS")
a3r <- subset(farms, Manag %in% c("BF", "HF"))
a3s <- sqldf("select * from farms where Manag in ('BF', 'HF')")
row.names(a3r) <- NULL
identical(a3r, a3s)

 

a4r <- subset(warpbreaks, breaks >= 20 & breaks <= 30)
a4s <- sqldf("select * from warpbreaks where breaks between 20 and 30",
                 row.names = TRUE)
identical(a4r, a4s)



a5r <- subset(farms, Mois == 'M1')
a5s <- sqldf("select * from farms where Mois = 'M1'", row.names = TRUE)
identical(a5r, a5s)
 

a6r <- subset(farms, Mois == 'M2')
a6s <- sqldf("select * from farms where Mois = 'M2'", row.names = TRUE)
identical(a6r, a6s)

(3)数据集合并

a7r <- rbind(a5r, a6r)
a7s <- sqldf("select * from a5s union all select * from a6s")



# aggregate
a8r <- aggregate(iris[1:2], iris[5], mean)#处理对象iris[1:2];分组iris[5];求均值
a8s <- sqldf('select Species, avg("Sepal.Length") `Sepal.Length`,
             avg("Sepal.Width") `Sepal.Width` from iris group by Species')
 
a9r <- do.call(rbind, by(iris, iris[5], function(x) with(x,
                                                      data.frame(Species = Species[1],
                                                                    mean.Sepal.Length = mean(Sepal.Length),
                                                                    mean.Sepal.Width = mean(Sepal.Width),
                                                                    mean.Sepal.ratio = mean(Sepal.Length/Sepal.Width)))))

###do.call() 是告诉list一个函数,然后list里的所有元素来执行这个函数。
row.names(a9r) <- NULL
a9s <- sqldf('select Species, avg("Sepal.Length") `mean.Sepal.Length`,
avg("Sepal.Width") `mean.Sepal.Width`,
avg("Sepal.Length"/"Sepal.Width") `mean.Sepal.ratio` from iris group by Species')



# head - top 3 breaks
a10r <- head(warpbreaks[order(warpbreaks$breaks, decreasing = TRUE), ], 3)
a10s <- sqldf("select * from warpbreaks order by breaks desc limit 3")
row.names(a10r) <- NULL
identical(a10r, a10s)
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值