安利一下R for Data Science這本書,作為R數(shù)據(jù)處理的神器。
全文思想就是獲得整潔數(shù)據(jù)(tidydata),并進行后續(xù)分析和可視化。
學(xué)習(xí)流程

tidydata:每一列都是變量,每一行都是觀察值
整潔的數(shù)據(jù)非常重要,因為一致的結(jié)構(gòu)使您可以將精力集中在有關(guān)數(shù)據(jù)的問題上,而不是為了使數(shù)據(jù)以正確的形式針對不同的功能而奮斗。
ready
運行本書中的代碼,需要四件事:R,RStudio,稱為tidyverse的R軟件包的集合,以及少數(shù)其他軟件包。包是可復(fù)制R代碼的基本單位。它們包括可重用的功能,描述如何使用它們的文檔以及示例數(shù)據(jù)。
install.packages("tidyverse")
除非您使用加載軟件包,否則將無法使用軟件包中的函數(shù),對象和幫助文件library()。安裝軟件包后,可以使用以下library()功能加載該軟件包:
library(tidyverse)
#> ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
#> ? ggplot2 3.3.2 ? purrr 0.3.4
#> ? tibble 3.0.3 ? dplyr 1.0.2
#> ? tidyr 1.1.2 ? stringr 1.4.0
#> ? readr 1.4.0 ? forcats 0.5.0
#> ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
#> ? dplyr::filter() masks stats::filter()
#> ? dplyr::lag() masks stats::lag()
這告訴您tidyverse正在加載ggplot2,tibble,tidyr,readr,purrr和dplyr軟件包。這些被認為是tidyverse的核心,因為您將在幾乎所有分析中都使用它們。
在本書中,我們將從tidyverse外部使用三個數(shù)據(jù)包:
install.packages(c("nycflights13", "gapminder", "Lahman"))
這些軟件包提供了有關(guān)航班,世界發(fā)展和棒球的數(shù)據(jù),我們將用它們來說明關(guān)鍵的數(shù)據(jù)科學(xué)思想。
在整本書中,我們使用一致的約定集來引用代碼:
函數(shù)采用代碼字體,后跟括號,如
sum()或mean()。其他R對象(如數(shù)據(jù)或函數(shù)參數(shù))采用代碼字體,不帶括號,如
flights或x。如果要弄清楚對象來自哪個包,我們將使用包名稱,后跟兩個冒號,例如
dplyr::mutate()或nycflights13::flights。這也是有效的R代碼。
1.6獲得幫助并了解更多信息
這本書不是一本孤島。沒有任何一種資源可以使您掌握R。在您開始將本書中介紹的技術(shù)應(yīng)用于您自己的數(shù)據(jù)時,您很快就會發(fā)現(xiàn)我們無法回答的問題。本節(jié)介紹了有關(guān)如何獲取幫助以及幫助您繼續(xù)學(xué)習(xí)的一些技巧。
如果您遇到困難,請從Google開始。通常,在查詢中添加“ R”足以將其限制在相關(guān)結(jié)果中:如果搜索沒有用,則通常意味著沒有任何特定于R的結(jié)果可用。Google對于出現(xiàn)錯誤消息特別有用。如果收到錯誤消息,但不知道它是什么意思,請嘗試使用Google搜索。過去可能有人對此感到困惑,并且網(wǎng)絡(luò)上的某些地方會有所幫助。(如果錯誤消息不是英語的,請運行Sys.setenv(LANGUAGE = "en")并重新運行代碼;您更有可能找到英語錯誤消息的幫助。)
如果Google沒有幫助,請嘗試stackoverflow。首先花一點時間搜索現(xiàn)有的答案,包括[R]將搜索范圍限制在使用R的問題和答案上。如果找不到有用的東西,請準備一個最小的可復(fù)制示例或reprex。好的代表可以使其他人更輕松地為您提供幫助,而且通常您會在解決問題的過程中自己解決問題。
為了使示例可重現(xiàn),需要包括三件事:所需的程序包,數(shù)據(jù)和代碼。
程序包應(yīng)加載到腳本的頂部,因此很容易看到示例所需的程序包?,F(xiàn)在是檢查每個軟件包是否使用最新版本的好時機。自安裝軟件包以來,您可能已經(jīng)發(fā)現(xiàn)了已修復(fù)的錯誤。對于tidyverse中的軟件包,最簡單的檢查方法是運行
tidyverse_update()。-
在問題中包含數(shù)據(jù)的最簡單方法是使用
dput()生成R代碼來重新創(chuàng)建它。例如,要mtcars在R中重新創(chuàng)建數(shù)據(jù)集,我將執(zhí)行以下步驟:dput(mtcars)在R中運行復(fù)制輸出
在我的可復(fù)制腳本中,鍵入
mtcars <-然后粘貼。
嘗試找到仍能揭示問題的最小數(shù)據(jù)子集。
-
花一點時間來確保您的代碼易于他人閱讀:
確保您使用了空格,并且變量名簡潔明了,但內(nèi)容豐富。
使用注釋來指示您的問題所在。
盡力刪除與該問題無關(guān)的所有內(nèi)容。 您的代碼越短,越容易理解,也越容易修復(fù)。
通過開始一個新的R會話并復(fù)制并粘貼腳本來檢查您是否確實制作了一個可復(fù)制的示例。
您還應(yīng)該花一些時間為解決問題做準備。從長遠來看,每天花一點時間學(xué)習(xí)R將會獲得豐厚的回報。一種方法是在RStudio博客上關(guān)注Hadley,Garrett和RStudio其他所有人的行為。我們在這里發(fā)布有關(guān)新軟件包,新IDE功能和現(xiàn)場課程的公告。您可能還希望在Twitter上關(guān)注Hadley(@hadleywickham)或Garrett(@statgarrett),或者關(guān)注@rstudiotips以跟上IDE中的新功能。
為了更廣泛地與R社區(qū)保持聯(lián)系,我們建議閱讀http://www.r-bloggers.com:它匯集了來自世界各地的500多個有關(guān)R的博客。如果您是活躍的Twitter用戶,請遵循(#rstats)標簽。Twitter是Hadley用來跟上社區(qū)的新發(fā)展的主要工具之一。
數(shù)據(jù)可視化
使用ggplot2,您可以使用函數(shù)開始繪圖ggplot()。ggplot()創(chuàng)建一個可以添加圖層的坐標系。的第一個參數(shù)ggplot()是要在圖形中使用的數(shù)據(jù)集。因此,ggplot(data = mpg)創(chuàng)建一個空圖,但這不是很有趣,因此我將不在這里顯示。
您可以通過向中添加一層或多層來完成圖形ggplot()。該函數(shù)geom_point()在您的繪圖上添加了一層點,從而創(chuàng)建了一個散點圖。ggplot2附帶了許多geom函數(shù),每個函數(shù)都會在繪圖中添加不同類型的圖層。在本章中,您將學(xué)到很多。
ggplot2中的每個geom函數(shù)都有一個mapping參數(shù)。這定義了數(shù)據(jù)集中的變量如何映射到視覺屬性。的mapping參數(shù)總是與配對aes(),以及x和y的參數(shù)aes()指定要映射哪些變量的x和y軸。ggplot2在自data變量(在本例中為)中查找映射的變量mpg。
3.2.3圖形模板
讓我們將此代碼轉(zhuǎn)換為可重復(fù)使用的模板,以使用ggplot2制作圖形。要制作圖表,請將下面代碼中的方括號部分替換為數(shù)據(jù)集,geom函數(shù)或一組映射。
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))
3.3 增加變量
美學(xué)映射,第三個變量
您可以class通過將其映射到美感來向二維散點圖添加第三個變量,例如。美觀是情節(jié)中對象的視覺屬性。美學(xué)包括點的大小,形狀或顏色之類的東西。您可以通過更改其美學(xué)屬性的值,以不同方式顯示一個點(如下所示)。由于我們已經(jīng)使用“值”一詞來描述數(shù)據(jù),所以讓我們使用“水平”一詞來描述美學(xué)特性。在這里,我們更改點的大小,形狀和顏色的級別,以使該點變小,呈三角形或呈藍色:
gplot2一次只能使用六個形狀。默認情況下,使用形狀美學(xué)時,其他組將不作圖。
對于每種美學(xué),您都aes()可以將美學(xué)名稱與要顯示的變量相關(guān)聯(lián)。該aes()函數(shù)將圖層使用的每個美學(xué)映射收集在一起,并將其傳遞給圖層的映射參數(shù)。語法突出顯示了有關(guān)x和的有用見解y:點的x和y本身就是美觀,可視化的屬性,您可以將其映射到變量以顯示有關(guān)數(shù)據(jù)的信息。
一旦繪制了美學(xué)圖,ggplot2就會處理其余的工作。它選擇了一個合理的比例以配合美學(xué),并構(gòu)造了一個圖例來解釋級別和值之間的映射。對于x和y美學(xué),ggplot2不會創(chuàng)建圖例,但會創(chuàng)建帶有刻度線和標簽的軸線。軸線充當圖例;它說明了位置和值之間的映射。
手動更改圖形的美學(xué)屬性
還可以手動設(shè)置幾何圖形的美學(xué)屬性。例如,我們可以將圖中的所有點設(shè)為藍色:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), color = "blue")
在這里,顏色不會傳達有關(guān)變量的信息,而只會改變圖形的外觀。要手動設(shè)置美學(xué),請按名稱將美學(xué)設(shè)置為geom函數(shù)的參數(shù);即它去外面的aes()。您需要選擇一種對于這種美學(xué)有意義的水平:
顏色的名稱,作為字符串。
點的大小,以毫米為單位。
點的形狀為數(shù)字,如圖3.1所示。

R具有25個內(nèi)置的形狀,這些形狀由數(shù)字標識。 有一些看似重復(fù)的對象:例如,0,15和22都是正方形。 區(qū)別來自“顏色”和“填充”美學(xué)的相互作用。 空心形狀(0--14)的邊界由“ colour”確定; 實心形狀(15--20)填充有“顏色”; 填充的形狀(21--24)的邊界為“顏色”,并填充為“填充”。
3.4常見問題
當您開始運行R代碼時,您可能會遇到問題。
首先,將您正在運行的代碼與本書中的代碼進行仔細比較。R非常挑剔,并且放錯位置的字符可能會有所不同。確保每個(都與匹配,)每個"都與另一個配對"。有時,您將運行代碼,但沒有任何反應(yīng)。檢查控制臺的左側(cè):如果是a +,則表示R認為您沒有鍵入完整的表達式,它正在等待您完成它。在這種情況下,按ESCAPE中止當前命令的處理通常很容易從頭開始。
創(chuàng)建ggplot2圖形時,一個常見的問題是將放在+錯誤的位置:它必須出現(xiàn)在行的末尾,而不是開始。換句話說,請確保您沒有意外地編寫如下代碼:
ggplot(data = mpg)
+ geom_point(mapping = aes(x = displ, y = hwy))
如果仍然遇到問題,請嘗試幫助。通過?function_name在控制臺中運行,或選擇函數(shù)名稱并在RStudio中按F1,可以獲得有關(guān)任何R函數(shù)的幫助。如果幫助看起來沒有幫助,請不要擔(dān)心-而是跳到示例并查找與您要執(zhí)行的操作匹配的代碼。
如果這樣做沒有幫助,請仔細閱讀錯誤消息。當然,搜索引擎更是一大利器,多搜索,會得到想要的答案。
3.5子圖
添加其他變量的一種方法是圖形美學(xué)。另一種對分類變量特別有用的方法是將繪圖劃分為構(gòu)面(子圖),每個子圖顯示數(shù)據(jù)的一個子集。
要通過單個變量對圖進行分面,請使用facet_wrap()。的第一個參數(shù)facet_wrap()應(yīng)該是公式,在公式中創(chuàng)建~后跟一個變量名(此處的“公式”是R中數(shù)據(jù)結(jié)構(gòu)的名稱,而不是“等式”的同義詞)。您傳遞給的變量facet_wrap()應(yīng)該是離散的。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2)
要在兩個變量的組合上顯示,請?zhí)砑?code>facet_grid()到情節(jié)調(diào)用中。的第一個參數(shù)facet_grid()也是一個公式。這次,公式應(yīng)包含兩個變量名,并用a分隔~。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
如果您不希望在行或列維中不使用構(gòu)面,請使用a.代替變量名,例如 + facet_grid(. ~ cyl)。
3.6幾何對象


兩個圖都包含相同的x變量,相同的y變量,并且都描述相同的數(shù)據(jù)。但是情節(jié)并不相同。每個圖都使用不同的視覺對象來表示數(shù)據(jù)。用ggplot2語法,我們說它們使用不同的geoms。
geom是繪圖中用來表示數(shù)據(jù)的幾何對象。人們通常根據(jù)地塊使用的幾何類型來描述地塊。例如,bar charts use bar geoms, line charts use line geoms, boxplots use boxplot geoms, and so on.散點圖打破了趨勢。他們使用點幾何。如上所述,您可以使用不同的幾何圖形來繪制相同的數(shù)據(jù)。上側(cè)的圖使用點幾何,而下側(cè)的圖使用平滑幾何,即擬合數(shù)據(jù)的平滑線。
要更改繪圖中的幾何圖形,請更改添加到的幾何圖形功能ggplot()。例如,要繪制上面的圖,可以使用以下代碼:
# up
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# down
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
要在同一圖中顯示多個幾何圖形,請將多個幾何圖形功能添加到ggplot():
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
進階:但是,這在我們的代碼中引入了一些重復(fù)。想象一下,如果您想將y軸更改為cty而不是hwy。您需要在兩個地方更改變量,而您可能忘記更新一個。您可以通過將一組映射傳遞到來避免這種重復(fù)ggplot()。ggplot2會將這些映射視為適用于圖中每個geom的全局映射。換句話說,此代碼將產(chǎn)生與先前代碼相同的圖:
ggplot(data = mpg) +
geom_point() +
geom_smooth()
如果將映射放置在geom函數(shù)中,則ggplot2會將其視為該圖層的本地映射。它將僅使用這些映射來擴展或覆蓋該層的全局映射。這使得可以在不同的層中顯示不同的圖形。
geom_point(mapping = aes(color = class)) +
geom_smooth()
??geom
練習(xí)
#在腦海中運行這段代碼,并預(yù)測輸出結(jié)果。然后,在R中運行代碼并檢查您的預(yù)測。
ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv)) +
geom_point() +
geom_smooth(se = FALSE)
ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv),
show.legend = FALSE #不添加標簽 )
#這兩圖是否一致
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
ggplot() +
geom_point(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_smooth(data = mpg, mapping = aes(x = displ, y = hwy))
重新創(chuàng)建生成以下圖形所需的R代碼。


3.7統(tǒng)計轉(zhuǎn)換
接下來,讓我們看一下條形圖。條形圖看起來很簡單,但是它們很有趣,因為它們揭示了一些關(guān)于圖的細微之處??紤]使用繪制的基本條形圖geom_bar()。下圖顯示了diamonds數(shù)據(jù)集中的鉆石總數(shù),按分組cut。該diamonds數(shù)據(jù)集進來GGPLOT2,并包含?54000顆鉆石,其中包括信息price,carat,color,clarity,和cut每顆鉆石的。圖表顯示,高質(zhì)量切割的鉆石比低質(zhì)量切割的鉆石更多。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))