
10個令人相見恨晚的R語言包
大約3年前我開始使用R,起初進展很慢,與我習(xí)慣的語言相比,語法更加直觀也比較簡單,而且需要一段時間才能習(xí)慣于細(xì)微的差別。我還不清楚語言的力量與社區(qū)和各種包的密切關(guān)系。
和其他語言(比如Python和Java)相比,R可以更模糊和麻煩。好消息是,有大量的包可以在R基礎(chǔ)庫上提供簡單和熟悉的界面。這篇文章是我喜歡和每天使用的10個包,并且我希望自己能早些知道他們。
1. sqldf
R語言學(xué)習(xí)曲線中最陡峭的一部分就是語法,我花了一段時間才習(xí)慣使用<-代替=。我聽到很多人問如何實現(xiàn)VLOOKUP?!?R 對于一般的數(shù)據(jù)粗加工任務(wù)非常有用,但需要一段時間才能掌握??梢哉J(rèn)為sqldf是我的R”輔助輪子”。
sqldf讓你在R數(shù)據(jù)框上執(zhí)行SQL查詢。來自SAS的人會發(fā)現(xiàn)它非常熟悉,任何具有基本SQL技能的人都可以輕松的使用它—sqldf使用SQLite語法。
install.packages("sqldf")
library(sqldf)
sqldf("SELECT
day
, avg(temp) as avg_temp
FROM beaver2
GROUP BY
day;")# day avg_temp#1 307 37.57931#2 308 37.71308#beavers1 和 beavers2 是R base 自帶的兩個數(shù)據(jù)集,記錄了兩種海貍的體溫序列beavers <- sqldf("select * from beaver1
union all
select * from beaver2;")#head(beavers)# day time temp activ#1 346 840 36.33 0#2 346 850 36.34 0#3 346 900 36.35 0#4 346 910 36.42 0#5 346 920 36.55 0#6 346 930 36.69 0movies <- data.frame(
title=c("The Great Outdoors", "Caddyshack", "Fletch", "Days of Thunder", "Crazy Heart"), year=c(1988, 1980, 1985, 1990, 2009)
)
boxoffice <- data.frame(
title=c("The Great Outdoors", "Caddyshack", "Fletch", "Days of Thunder","Top Gun"),
revenue=c(43455230, 39846344, 59600000, 157920733, 353816701)
)
sqldf("SELECT
m.*
, b.revenue
FROM
movies m
INNER JOIN
boxoffice b
ON m.title = b.title;")# title year revenue#1 The Great Outdoors 1988 43455230#2 Caddyshack 1980 39846344#3 Fletch 1985 59600000#4 Days of Thunder 1990 157920733
如果你喜歡sqldf,可以使用pandasql包來查詢pandas中的DataFrame,通過SQL。
2. forecast
我不經(jīng)常做時間序列分析,但是當(dāng)我做的時候forecast包是我的選擇。forecast對ARIMA,ARMA,AR,指數(shù)平滑等時間序列模型的預(yù)測簡單的令人難以置信
install.packages("forecast")library(forecast)# mdeaths: 英國每月死于肺病的人數(shù)fit <- auto.arima(mdeaths)#定制你的置信區(qū)間forecast(fit, level=c(80, 95, 99), h=3)# Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 Lo 99 Hi 99#Jan 1980 1822.863 1564.192 2081.534 1427.259 2218.467 1302.952 2342.774#Feb 1980 1923.190 1635.530 2210.851 1483.251 2363.130 1345.012 2501.368#Mar 1980 1789.153 1495.048 2083.258 1339.359 2238.947 1198.023 2380.283plot(forecast(fit), shadecols="oldstyle")
我最喜歡的特性是產(chǎn)生預(yù)測的時序圖。
3. plyr
當(dāng)我第一次使用R時,我用基本的控制運算來操縱數(shù)據(jù)(for, if, while, etc.)。我很快知道這是一個業(yè)余的做法,并且有更好的方法去實現(xiàn)。
在R中,apply函數(shù)族是在對列表或者向量每個元素調(diào)用函數(shù)的首選方法。雖然R基礎(chǔ)庫中有這些函數(shù),但它們的使用可能難以掌握。我發(fā)現(xiàn)plyr包 是一個對R基礎(chǔ)庫中諸如split,apply, combine的泛函的更好用的替代。
plyr 給予你一些函數(shù) (ddply, daply, dlply, adply, ldply)按照常見的藍(lán)圖:將數(shù)據(jù)結(jié)構(gòu)分組拆分,對每個組應(yīng)用一個函數(shù),將結(jié)果返回到數(shù)據(jù)結(jié)構(gòu)中。
ddply 拆分一個數(shù)據(jù)框(data frame)并且返回一個數(shù)據(jù)框 (所以是 dd)。 daply 拆分一個數(shù)據(jù)框并且返回一個數(shù)組(array) (所以是 da)。希望你明白這個想法。
譯者注:plyr包包含了12個命名與功能相關(guān)的函數(shù),均以..ply命名,第一個.表示輸入的數(shù)據(jù)類型(a數(shù)組 d數(shù)據(jù)框 l列表),第二個.表示輸出的數(shù)據(jù)類型(_表示不輸出)
install.packages("plyr")library(plyr)# 按照 Species 拆分?jǐn)?shù)據(jù)庫,匯總一下,然后轉(zhuǎn)換結(jié)果# 到數(shù)據(jù)框ddply(iris, .(Species), summarise,
mean_petal_length=mean(Petal.Length)
)# Species mean_petal_length#1 setosa 1.462#2 versicolor 4.260#3 virginica 5.552# 按照 Species 拆分?jǐn)?shù)據(jù)庫,匯總一下,然后轉(zhuǎn)換結(jié)果# 到數(shù)組unlist(daply(iris[,4:5], .(Species), colwise(mean)))# setosa.Petal.Width versicolor.Petal.Width virginica.Petal.Width# 0.246 1.326 2.026
4. stringr
我發(fā)現(xiàn)R基礎(chǔ)庫的字符串功能使用起來非常困難和麻煩。Hadley Wickham編寫的另一個包, stringr,提供了一些非常需要的字符串運算符。很多函數(shù)使用那些做基礎(chǔ)分析時不常用的數(shù)據(jù)結(jié)構(gòu)。
stringr 非常易于使用。幾乎所有的(和所有的重要功能)都以”str”為前綴,所以很容易記住。
install.packages("stringr")library(stringr)names(iris)#[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"names(iris) <- str_replace_all(names(iris), "[.]", "_")names(iris)#[1] "Sepal_Length" "Sepal_Width" "Petal_Length" "Petal_Width" "Species"s <- c("Go to Heaven for the climate, Hell for the company.")str_extract_all(s, "[H][a-z]+ ")#[[1]]
#[1] "Heaven " "Hell "
5. 數(shù)據(jù)庫驅(qū)動的包
install.packages("RPostgreSQL")install.packages("RMySQL")install.packages("RMongo")install.packages("RODBC")install.packages("RSQLite")
每個人(包括我自己)開始的時候都會這樣做。你剛在首選的SQL編輯器中寫了一個很棒的查詢。一切都是完美的—列名都是snake case(譯者注:表示單詞之間用下劃線連接。單詞要么全部大寫,要么全部小寫。),日期有正確的數(shù)據(jù)類型,最后調(diào)試出了"must appear in the GROUP BY clause or be used in an aggregate function"的問題。你現(xiàn)在準(zhǔn)備在R中進行一些分析,因此你可以在SQL編輯器中運行查詢,將結(jié)果復(fù)制到csv(或者……xlsx)并讀入R,你并不需要這樣做!
R對于幾乎每一個可以想到的數(shù)據(jù)庫都有好的驅(qū)動。當(dāng)你在偶爾使用不具有獨立驅(qū)動程序的數(shù)據(jù)庫(SQL Server)時,你可以隨時使用RODBC。
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
db <- dbConnect(drv, dbname="ncaa",
user="YOUR USER NAME", password="YOUR PASSWORD")
q <- "SELECT
*
FROM
game_scores;"data <- dbGetQuery(db, q)
head(data)#id school game_date spread school_score opponent opp_score was_home#1 45111 Boston College 1985-11-16 6.0 21 Syracuse 41 False#2 45112 Boston College 1985-11-02 13.5 12 Penn State 16 False#3 45113 Boston College 1985-10-26 -11.0 17 Cincinnati 24 False#4 45114 Boston College 1985-10-12 -2.0 14 Army 45 False#5 45115 Boston College 1985-09-28 5.0 10 Miami 45 True#6 45116 Boston College 1985-09-21 6.5 29 Pittsburgh 22 Falsenrow(data)#[1] 30932ncol(data)#[1] 8
下次你完成了完美的查詢后,只需要粘貼到R里面,即可使用 RPostgreSQL, RMySQL,RMongo, SQLite, 或 RODBC執(zhí)行。不僅可以避免生成數(shù)以百計的CSV文件,在R中運行查詢還可以節(jié)省I/O和轉(zhuǎn)換數(shù)據(jù)類型的時間。日期,時間等會自動設(shè)置為R中的等價表示。它還使你的R腳本可重復(fù),因此你或你團隊中的其他人可以輕松獲得相同的結(jié)果。
6. lubridate
在R中處理日期我從來沒有幸運過。我從來沒有完全掌握用POSIXs和R內(nèi)建日期類型合作的方法。請用 lubridate。
lubridate 是那些似乎完全按照你期望的神包之一。這些函數(shù)都有易懂的名字如 year,month, ymd, 和 ymd_hms。對于熟悉javascript的人來說,它類似于Moment.js 。
install.packages("lubridate")
library(lubridate)year("2012-12-12")#[1] 2012day("2012-12-12")#[1] 12ymd("2012-12-12")#1 按照 %Y-%m-%d 的方式解析#[1] "2012-12-12 UTC"
這是我在一篇文章發(fā)現(xiàn)的非常方便的參考卡片。它涵蓋了你處理日期時可能想要做的一切事情。 我還發(fā)現(xiàn)了這個日期速查表也可以作為一個方便的參考。
7. ggplot2
另一個Hadley Wickham的包,也許是他最知名的一個。 ggplot2在每個人“喜愛的R包”的列表中排名很高。 它很容易使用,并且產(chǎn)生一些很好看的圖像。 這是介紹你的工作的好方法,有很多資源可以幫助你開始使用。
ggplot2:數(shù)據(jù)分析與圖形藝術(shù) by Hadley Wickham (Amazon)
從Excel到ggplot的羅塞塔石碑 (Yaksis Blog)
Hadley Wickham在Google的ggplot2演講 (youtube)
R數(shù)據(jù)可視化手冊 by Winston Chang (Amazon)
8. qcc
install.packages("qcc")library(qcc)# 均值為10的序列,加上白噪聲x <- rep(10, 100) + rnorm(100)# 測試序列,均值為11new.x <- rep(11, 15) + rnorm(15)# qcc 會標(biāo)記出新的點qcc(x, newdata=new.x, type="xbar.one")
qcc 是用于 統(tǒng)計質(zhì)量控制的庫。 早在上世紀(jì)五十年代,現(xiàn)已不復(fù)存在的西方電氣公司正在尋找一種更好檢測電話線和電線問題的方法。他們提出了一系列 規(guī)則 來幫助識別有問題的線。規(guī)則觀察一系列數(shù)據(jù)點的歷史平均值,并且基于標(biāo)準(zhǔn)差的偏差,該規(guī)則有助于判斷一組新的點是否經(jīng)歷均值漂移。
典型的例子是監(jiān)控生產(chǎn) 螺母的機器。假設(shè)機器應(yīng)該生產(chǎn)2.5英寸長的螺母。我們測量一系列的螺母: 2.48, 2.47, 2.51, 2.52, 2.54, 2.42, 2.52, 2.58, 2.51。機器出故障了嗎?很難說,但上述規(guī)則可以幫助描述。
雖然你可能不會監(jiān)控電話線,qcc可幫你監(jiān)控你網(wǎng)站的交易量,數(shù)據(jù)庫的訪問者或者登錄名,以及其他許多流程。
9. reshape2
我經(jīng)常發(fā)現(xiàn),任何分析中最難的部分是把數(shù)據(jù)轉(zhuǎn)化成正確的格式。 reshape2 正是Hadley Wickham的另一個軟件包,專門用于 “寬”數(shù)據(jù)表 和“窄”數(shù)據(jù)表 的轉(zhuǎn)換。我一般會和ggplot2 及 plyr一起使用它。
install.packages("reshape2")library(reshape2)# 為每一行生成唯一的ID; 這樣我們可以稍后轉(zhuǎn)回到寬格式iris$id <- 1:nrow(iris)iris.lng <- melt(iris, id=c("id", "Species"))head(iris.lng)# id Species variable value#1 1 setosa Sepal.Length 5.1#2 2 setosa Sepal.Length 4.9#3 3 setosa Sepal.Length 4.7#4 4 setosa Sepal.Length 4.6#5 5 setosa Sepal.Length 5.0#6 6 setosa Sepal.Length 5.4iris.wide <- dcast(iris.lng, id + Species ~ variable)head(iris.wide)# id Species Sepal.Length Sepal.Width Petal.Length Petal.Width#1 1 setosa 5.1 3.5 1.4 0.2#2 2 setosa 4.9 3.0 1.4 0.2#3 3 setosa 4.7 3.2 1.3 0.2#4 4 setosa 4.6 3.1 1.5 0.2#5 5 setosa 5.0 3.6 1.4 0.2#6 6 setosa 5.4 3.9 1.7 0.4library(ggplot2)# 為數(shù)據(jù)集中每個數(shù)值列繪制直方圖p <- ggplot(aes(x=value, fill=Species), data=iris.lng)p + geom_histogram() +
facet_wrap(~variable, scales="free")
這是一個快速查看數(shù)據(jù)集并且獲得轉(zhuǎn)接的方法。你可以使用 melt 函數(shù)將寬數(shù)據(jù)轉(zhuǎn)換為窄數(shù)據(jù), 使用 dcast 將窄數(shù)據(jù)轉(zhuǎn)換為寬數(shù)據(jù)。
10. randomForest
如果這個列表不包括至少一個能你的朋友震驚的機器學(xué)習(xí)包就不會完整。隨機森林 是一個很好的算法。它很容易使用,可以進行監(jiān)督學(xué)習(xí)或者無監(jiān)督學(xué)習(xí),它可以與許多不同類型的數(shù)據(jù)集一起使用,但最重要的是它的高效率!這是它在R中的使用方法。
install.packages("randomForest")
library(randomForest)# 下載泰坦尼克號幸存者數(shù)據(jù)集data <- read.table("http://math.ucdenver.edu/RTutorial/titanic.txt", h=T, sep="\t")# 將Survived列轉(zhuǎn)為yes/no因子data$Survived <- as.factor(ifelse(data$Survived==1, "yes", "no"))
# 拆分為訓(xùn)練集和測試集idx <- runif(nrow(data)) <= .75data.train <- data[idx,]
data.test <- data[-idx,]# 訓(xùn)練一個隨機森林rf <- randomForest(Survived ~ PClass + Age + Sex, data=data.train, importance=TRUE, na.action=na.omit)# 模型中每個變量的重要程度imp <- importance(rf)
o <- order(imp[,3], decreasing=T)
imp[o,]# no yes MeanDecreaseAccuracy MeanDecreaseGini#Sex 51.49855 53.30255 55.13458 63.46861#PClass 25.48715 24.12522 28.43298 22.31789#Age 20.08571 14.07954 24.64607 19.57423# 混淆矩陣 [[真反例, 假正例], [假反例, 正正例]]table(data.test$Survived, predict(rf, data.test), dnn=list("actual", "predicted"))# predicted#actual no yes# no 427 16# yes 117 195
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10