#使用SQL語句操作數據框,需要加載的程序包sqldf,tcltk,使用iris數據集以及演示
library(sqldf)
library(tcltk)
head(iris)#了解數據集由5各變量組成
#取出前幾行
a1r <- head(iris,10)#一般方法
a1s <- sqldf("select * from iris limit 10")#取出數據框的前六行,關鍵詞limit
identical(a1r, a1s)#比較兩個數據框是否相同
#取出子集
a2r <- subset(iris, grepl("^se", Species))#取出物種列中以se開頭的數據子集
a2s <- sqldf("select * from iris where Species like 'se%'")#取出數據的子集,關鍵詞like
all.equal(as.data.frame(a2r), a2s)#檢驗數據是否有差異
#指定某變量值為兩個以上時的提取
a3r <- subset(iris, Species %in% c("setosa", "virginica"))#在iris數據集中,選出量物種是setosa和virginica的行
a3s <- sqldf("select * from iris where Species in ('setosa', 'virginica')")#注意單引號和雙引號
row.names(a3r) <- NULL#a3r選的是子集,因而行名還是與原數據集相同
identical(a3r, a3s)
#指定某變量範圍時數據集的提取
a4r <- subset(iris, Petal.Length >= 0 & Petal.Length <= 2.0)#選取breaks在20到30之間的數據
a4s <- sqldf("select * from iris where Petal.Length between 0 and 2.0", row.names = TRUE)#使用row.names=TRUE可以不把行名重命名
iris$Petal.Length
#數據合計
a5r <- aggregate(iris[1:2], iris[5], mean)#計算出了3個物種前兩個變量的平均值
a5s <- sqldf('select Species, avg("Sepal.Length") `Sepal.Length`, avg("Sepal.Width") `Sepal.Width` from iris group by Species')#關鍵詞group by
all.equal(a5r, a5s)#查看數據是否相同
# 提取某變量breaks從小到大排序後的前3行的數據,除數據屬性和列名外相同
head(warpbreaks)
a6r <- head(warpbreaks[order(warpbreaks$breaks), ], 3)
a6s <- sqldf("select * from warpbreaks order by breaks limit 3")
# attributes(a6r) <- attributes(a6s) <- NULL#去除屬性
row.names(a6r) <- NULL#去除列
identical(a6r, a6s)
# 提取某變量breaks從大到小排序後的前3行的數據,除數據屬性和列名外相同
a7r <- head(warpbreaks[order(warpbreaks$breaks, decreasing = TRUE), ], 3)
a7s <- sqldf("select * from warpbreaks order by breaks desc limit 3")#關鍵詞order by,desc表示降序
row.names(a7r) <- NULL
identical(a7r, a7s)