安利一下R for Data Science這本書审胸,作為R數(shù)據(jù)處理的神器梭纹。
全文思想就是獲得整潔數(shù)據(jù)(tidydata)捺僻,并進(jìn)行后續(xù)分析和可視化恋技。
學(xué)習(xí)流程
tidydata:每一列都是變量拇舀,每一行都是觀察值
整潔的數(shù)據(jù)非常重要,因?yàn)橐恢碌慕Y(jié)構(gòu)使您可以將精力集中在有關(guān)數(shù)據(jù)的問(wèn)題上蜻底,而不是為了使數(shù)據(jù)以正確的形式針對(duì)不同的功能而奮斗骄崩。
ready
運(yùn)行本書中的代碼,需要四件事:R薄辅,RStudio要拂,稱為tidyverse的R軟件包的集合,以及少數(shù)其他軟件包站楚。包是可復(fù)制R代碼的基本單位脱惰。它們包括可重用的功能,描述如何使用它們的文檔以及示例數(shù)據(jù)窿春。
install.packages("tidyverse")
除非您使用加載軟件包拉一,否則將無(wú)法使用軟件包中的函數(shù),對(duì)象和幫助文件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軟件包延赌。這些被認(rèn)為是tidyverse的核心除盏,因?yàn)槟鷮⒃趲缀跛蟹治鲋卸际褂盟鼈儭?/p>
在本書中,我們將從tidyverse外部使用三個(gè)數(shù)據(jù)包:
install.packages(c("nycflights13", "gapminder", "Lahman"))
這些軟件包提供了有關(guān)航班皮胡,世界發(fā)展和棒球的數(shù)據(jù)痴颊,我們將用它們來(lái)說(shuō)明關(guān)鍵的數(shù)據(jù)科學(xué)思想。
在整本書中屡贺,我們使用一致的約定集來(lái)引用代碼:
函數(shù)采用代碼字體蠢棱,后跟括號(hào)锌杀,如
sum()
或mean()
。其他R對(duì)象(如數(shù)據(jù)或函數(shù)參數(shù))采用代碼字體泻仙,不帶括號(hào)糕再,如
flights
或x
。如果要弄清楚對(duì)象來(lái)自哪個(gè)包玉转,我們將使用包名稱突想,后跟兩個(gè)冒號(hào),例如
dplyr::mutate()
或nycflights13::flights
究抓。這也是有效的R代碼猾担。
1.6獲得幫助并了解更多信息
這本書不是一本孤島。沒(méi)有任何一種資源可以使您掌握R刺下。在您開(kāi)始將本書中介紹的技術(shù)應(yīng)用于您自己的數(shù)據(jù)時(shí)绑嘹,您很快就會(huì)發(fā)現(xiàn)我們無(wú)法回答的問(wèn)題。本節(jié)介紹了有關(guān)如何獲取幫助以及幫助您繼續(xù)學(xué)習(xí)的一些技巧橘茉。
如果您遇到困難工腋,請(qǐng)從Google開(kāi)始。通常畅卓,在查詢中添加“ R”足以將其限制在相關(guān)結(jié)果中:如果搜索沒(méi)有用擅腰,則通常意味著沒(méi)有任何特定于R的結(jié)果可用。Google對(duì)于出現(xiàn)錯(cuò)誤消息特別有用翁潘。如果收到錯(cuò)誤消息趁冈,但不知道它是什么意思,請(qǐng)嘗試使用Google搜索唐础。過(guò)去可能有人對(duì)此感到困惑箱歧,并且網(wǎng)絡(luò)上的某些地方會(huì)有所幫助。(如果錯(cuò)誤消息不是英語(yǔ)的一膨,請(qǐng)運(yùn)行Sys.setenv(LANGUAGE = "en")
并重新運(yùn)行代碼呀邢;您更有可能找到英語(yǔ)錯(cuò)誤消息的幫助。)
如果Google沒(méi)有幫助豹绪,請(qǐng)嘗試stackoverflow价淌。首先花一點(diǎn)時(shí)間搜索現(xiàn)有的答案,包括[R]
將搜索范圍限制在使用R的問(wèn)題和答案上瞒津。如果找不到有用的東西蝉衣,請(qǐng)準(zhǔn)備一個(gè)最小的可復(fù)制示例或reprex。好的代表可以使其他人更輕松地為您提供幫助巷蚪,而且通常您會(huì)在解決問(wèn)題的過(guò)程中自己解決問(wèn)題病毡。
為了使示例可重現(xiàn),需要包括三件事:所需的程序包屁柏,數(shù)據(jù)和代碼啦膜。
程序包應(yīng)加載到腳本的頂部有送,因此很容易看到示例所需的程序包。現(xiàn)在是檢查每個(gè)軟件包是否使用最新版本的好時(shí)機(jī)僧家。自安裝軟件包以來(lái)雀摘,您可能已經(jīng)發(fā)現(xiàn)了已修復(fù)的錯(cuò)誤。對(duì)于tidyverse中的軟件包八拱,最簡(jiǎn)單的檢查方法是運(yùn)行
tidyverse_update()
阵赠。-
在問(wèn)題中包含數(shù)據(jù)的最簡(jiǎn)單方法是使用
dput()
生成R代碼來(lái)重新創(chuàng)建它。例如肌稻,要mtcars
在R中重新創(chuàng)建數(shù)據(jù)集清蚀,我將執(zhí)行以下步驟:dput(mtcars)
在R中運(yùn)行復(fù)制輸出
在我的可復(fù)制腳本中,鍵入
mtcars <-
然后粘貼灯萍。
嘗試找到仍能揭示問(wèn)題的最小數(shù)據(jù)子集轧铁。
-
花一點(diǎn)時(shí)間來(lái)確保您的代碼易于他人閱讀:
確保您使用了空格,并且變量名簡(jiǎn)潔明了旦棉,但內(nèi)容豐富。
使用注釋來(lái)指示您的問(wèn)題所在药薯。
盡力刪除與該問(wèn)題無(wú)關(guān)的所有內(nèi)容绑洛。 您的代碼越短,越容易理解童本,也越容易修復(fù)真屯。
通過(guò)開(kāi)始一個(gè)新的R會(huì)話并復(fù)制并粘貼腳本來(lái)檢查您是否確實(shí)制作了一個(gè)可復(fù)制的示例。
您還應(yīng)該花一些時(shí)間為解決問(wèn)題做準(zhǔn)備穷娱。從長(zhǎng)遠(yuǎn)來(lái)看徘铝,每天花一點(diǎn)時(shí)間學(xué)習(xí)R將會(huì)獲得豐厚的回報(bào)磁浇。一種方法是在RStudio博客上關(guān)注Hadley,Garrett和RStudio其他所有人的行為。我們?cè)谶@里發(fā)布有關(guān)新軟件包兆蕉,新IDE功能和現(xiàn)場(chǎng)課程的公告。您可能還希望在Twitter上關(guān)注Hadley(@hadleywickham)或Garrett(@statgarrett)创泄,或者關(guān)注@rstudiotips以跟上IDE中的新功能沪蓬。
為了更廣泛地與R社區(qū)保持聯(lián)系,我們建議閱讀http://www.r-bloggers.com:它匯集了來(lái)自世界各地的500多個(gè)有關(guān)R的博客羞秤。如果您是活躍的Twitter用戶缸托,請(qǐng)遵循(#rstats
)標(biāo)簽。Twitter是Hadley用來(lái)跟上社區(qū)的新發(fā)展的主要工具之一瘾蛋。
數(shù)據(jù)可視化
使用ggplot2俐镐,您可以使用函數(shù)開(kāi)始繪圖ggplot()
。ggplot()
創(chuàng)建一個(gè)可以添加圖層的坐標(biāo)系哺哼。的第一個(gè)參數(shù)ggplot()
是要在圖形中使用的數(shù)據(jù)集佩抹。因此叼风,ggplot(data = mpg)
創(chuàng)建一個(gè)空?qǐng)D,但這不是很有趣匹摇,因此我將不在這里顯示咬扇。
您可以通過(guò)向中添加一層或多層來(lái)完成圖形ggplot()
。該函數(shù)geom_point()
在您的繪圖上添加了一層點(diǎn)廊勃,從而創(chuàng)建了一個(gè)散點(diǎn)圖懈贺。ggplot2附帶了許多geom函數(shù),每個(gè)函數(shù)都會(huì)在繪圖中添加不同類型的圖層坡垫。在本章中梭灿,您將學(xué)到很多。
ggplot2中的每個(gè)geom函數(shù)都有一個(gè)mapping
參數(shù)冰悠。這定義了數(shù)據(jù)集中的變量如何映射到視覺(jué)屬性堡妒。的mapping
參數(shù)總是與配對(duì)aes()
,以及x
和y
的參數(shù)aes()
指定要映射哪些變量的x和y軸溉卓。ggplot2在自data
變量(在本例中為)中查找映射的變量mpg
皮迟。
3.2.3圖形模板
讓我們將此代碼轉(zhuǎn)換為可重復(fù)使用的模板,以使用ggplot2制作圖形桑寨。要制作圖表伏尼,請(qǐng)將下面代碼中的方括號(hào)部分替換為數(shù)據(jù)集,geom函數(shù)或一組映射尉尾。
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))
3.3 增加變量
美學(xué)映射爆阶,第三個(gè)變量
您可以class
通過(guò)將其映射到美感來(lái)向二維散點(diǎn)圖添加第三個(gè)變量,例如沙咏。美觀是情節(jié)中對(duì)象的視覺(jué)屬性辨图。美學(xué)包括點(diǎn)的大小,形狀或顏色之類的東西肢藐。您可以通過(guò)更改其美學(xué)屬性的值故河,以不同方式顯示一個(gè)點(diǎn)(如下所示)。由于我們已經(jīng)使用“值”一詞來(lái)描述數(shù)據(jù)窖壕,所以讓我們使用“水平”一詞來(lái)描述美學(xué)特性忧勿。在這里,我們更改點(diǎn)的大小瞻讽,形狀和顏色的級(jí)別鸳吸,以使該點(diǎn)變小,呈三角形或呈藍(lán)色:
gplot2一次只能使用六個(gè)形狀速勇。默認(rèn)情況下晌砾,使用形狀美學(xué)時(shí),其他組將不作圖烦磁。
對(duì)于每種美學(xué)养匈,您都aes()
可以將美學(xué)名稱與要顯示的變量相關(guān)聯(lián)哼勇。該aes()
函數(shù)將圖層使用的每個(gè)美學(xué)映射收集在一起,并將其傳遞給圖層的映射參數(shù)呕乎。語(yǔ)法突出顯示了有關(guān)x
和的有用見(jiàn)解y
:點(diǎn)的x和y本身就是美觀积担,可視化的屬性,您可以將其映射到變量以顯示有關(guān)數(shù)據(jù)的信息猬仁。
一旦繪制了美學(xué)圖帝璧,ggplot2就會(huì)處理其余的工作。它選擇了一個(gè)合理的比例以配合美學(xué)湿刽,并構(gòu)造了一個(gè)圖例來(lái)解釋級(jí)別和值之間的映射的烁。對(duì)于x和y美學(xué),ggplot2不會(huì)創(chuàng)建圖例诈闺,但會(huì)創(chuàng)建帶有刻度線和標(biāo)簽的軸線渴庆。軸線充當(dāng)圖例;它說(shuō)明了位置和值之間的映射雅镊。
手動(dòng)更改圖形的美學(xué)屬性
還可以手動(dòng)設(shè)置幾何圖形的美學(xué)屬性襟雷。例如,我們可以將圖中的所有點(diǎn)設(shè)為藍(lán)色:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), color = "blue")
在這里仁烹,顏色不會(huì)傳達(dá)有關(guān)變量的信息嗤军,而只會(huì)改變圖形的外觀。要手動(dòng)設(shè)置美學(xué)晃危,請(qǐng)按名稱將美學(xué)設(shè)置為geom函數(shù)的參數(shù);即它去外面的aes()
老客。您需要選擇一種對(duì)于這種美學(xué)有意義的水平:
顏色的名稱僚饭,作為字符串。
點(diǎn)的大小胧砰,以毫米為單位鳍鸵。
點(diǎn)的形狀為數(shù)字,如圖3.1所示尉间。
R具有25個(gè)內(nèi)置的形狀偿乖,這些形狀由數(shù)字標(biāo)識(shí)。 有一些看似重復(fù)的對(duì)象:例如哲嘲,0贪薪,15和22都是正方形。 區(qū)別來(lái)自“顏色”和“填充”美學(xué)的相互作用眠副。 空心形狀(0--14)的邊界由“ colour”確定画切; 實(shí)心形狀(15--20)填充有“顏色”; 填充的形狀(21--24)的邊界為“顏色”囱怕,并填充為“填充”霍弹。
3.4常見(jiàn)問(wèn)題
當(dāng)您開(kāi)始運(yùn)行R代碼時(shí)毫别,您可能會(huì)遇到問(wèn)題。
首先典格,將您正在運(yùn)行的代碼與本書中的代碼進(jìn)行仔細(xì)比較岛宦。R非常挑剔,并且放錯(cuò)位置的字符可能會(huì)有所不同耍缴。確保每個(gè)(
都與匹配砾肺,)
每個(gè)"
都與另一個(gè)配對(duì)"
。有時(shí)私恬,您將運(yùn)行代碼债沮,但沒(méi)有任何反應(yīng)。檢查控制臺(tái)的左側(cè):如果是a +
本鸣,則表示R認(rèn)為您沒(méi)有鍵入完整的表達(dá)式疫衩,它正在等待您完成它。在這種情況下荣德,按ESCAPE中止當(dāng)前命令的處理通常很容易從頭開(kāi)始闷煤。
創(chuàng)建ggplot2圖形時(shí),一個(gè)常見(jiàn)的問(wèn)題是將放在+
錯(cuò)誤的位置:它必須出現(xiàn)在行的末尾涮瞻,而不是開(kāi)始鲤拿。換句話說(shuō),請(qǐng)確保您沒(méi)有意外地編寫如下代碼:
ggplot(data = mpg)
+ geom_point(mapping = aes(x = displ, y = hwy))
如果仍然遇到問(wèn)題署咽,請(qǐng)嘗試幫助近顷。通過(guò)?function_name
在控制臺(tái)中運(yùn)行,或選擇函數(shù)名稱并在RStudio中按F1宁否,可以獲得有關(guān)任何R函數(shù)的幫助窒升。如果幫助看起來(lái)沒(méi)有幫助,請(qǐng)不要擔(dān)心-而是跳到示例并查找與您要執(zhí)行的操作匹配的代碼慕匠。
如果這樣做沒(méi)有幫助饱须,請(qǐng)仔細(xì)閱讀錯(cuò)誤消息。當(dāng)然台谊,搜索引擎更是一大利器蓉媳,多搜索,會(huì)得到想要的答案锅铅。
3.5子圖
添加其他變量的一種方法是圖形美學(xué)酪呻。另一種對(duì)分類變量特別有用的方法是將繪圖劃分為構(gòu)面(子圖),每個(gè)子圖顯示數(shù)據(jù)的一個(gè)子集狠角。
要通過(guò)單個(gè)變量對(duì)圖進(jìn)行分面号杠,請(qǐng)使用facet_wrap()
。的第一個(gè)參數(shù)facet_wrap()
應(yīng)該是公式,在公式中創(chuàng)建~
后跟一個(gè)變量名(此處的“公式”是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)
要在兩個(gè)變量的組合上顯示眼溶,請(qǐng)?zhí)砑?code>facet_grid()到情節(jié)調(diào)用中悠砚。的第一個(gè)參數(shù)facet_grid()
也是一個(gè)公式。這次堂飞,公式應(yīng)包含兩個(gè)變量名灌旧,并用a分隔~
。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
如果您不希望在行或列維中不使用構(gòu)面绰筛,請(qǐng)使用a.
代替變量名枢泰,例如 + facet_grid(. ~ cyl)
。
3.6幾何對(duì)象
兩個(gè)圖都包含相同的x變量铝噩,相同的y變量衡蚂,并且都描述相同的數(shù)據(jù)。但是情節(jié)并不相同骏庸。每個(gè)圖都使用不同的視覺(jué)對(duì)象來(lái)表示數(shù)據(jù)毛甲。用ggplot2語(yǔ)法,我們說(shuō)它們使用不同的geoms具被。
geom是繪圖中用來(lái)表示數(shù)據(jù)的幾何對(duì)象玻募。人們通常根據(jù)地塊使用的幾何類型來(lái)描述地塊。例如一姿,bar charts use bar geoms, line charts use line geoms, boxplots use boxplot geoms, and so on.散點(diǎn)圖打破了趨勢(shì)七咧。他們使用點(diǎn)幾何。如上所述叮叹,您可以使用不同的幾何圖形來(lái)繪制相同的數(shù)據(jù)坑雅。上側(cè)的圖使用點(diǎn)幾何,而下側(cè)的圖使用平滑幾何衬横,即擬合數(shù)據(jù)的平滑線。
要更改繪圖中的幾何圖形终蒂,請(qǐng)更改添加到的幾何圖形功能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))
要在同一圖中顯示多個(gè)幾何圖形噪叙,請(qǐng)將多個(gè)幾何圖形功能添加到ggplot():
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
進(jìn)階:但是,這在我們的代碼中引入了一些重復(fù)霉翔。想象一下睁蕾,如果您想將y軸更改為cty而不是hwy。您需要在兩個(gè)地方更改變量,而您可能忘記更新一個(gè)子眶。您可以通過(guò)將一組映射傳遞到來(lái)避免這種重復(fù)ggplot()瀑凝。ggplot2會(huì)將這些映射視為適用于圖中每個(gè)geom的全局映射。換句話說(shuō)臭杰,此代碼將產(chǎn)生與先前代碼相同的圖:
ggplot(data = mpg) +
geom_point() +
geom_smooth()
如果將映射放置在geom函數(shù)中粤咪,則ggplot2會(huì)將其視為該圖層的本地映射。它將僅使用這些映射來(lái)擴(kuò)展或覆蓋該層的全局映射渴杆。這使得可以在不同的層中顯示不同的圖形寥枝。
geom_point(mapping = aes(color = class)) +
geom_smooth()
??geom
練習(xí)
#在腦海中運(yùn)行這段代碼,并預(yù)測(cè)輸出結(jié)果磁奖。然后囊拜,在R中運(yùn)行代碼并檢查您的預(yù)測(cè)。
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 #不添加標(biāo)簽 )
#這兩圖是否一致
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)計(jì)轉(zhuǎn)換
接下來(lái)冠跷,讓我們看一下條形圖。條形圖看起來(lái)很簡(jiǎn)單敢辩,但是它們很有趣蔽莱,因?yàn)樗鼈兘沂玖艘恍╆P(guān)于圖的細(xì)微之處∑莩ぃ考慮使用繪制的基本條形圖geom_bar()
盗冷。下圖顯示了diamonds
數(shù)據(jù)集中的鉆石總數(shù),按分組cut
同廉。該diamonds
數(shù)據(jù)集進(jìn)來(lái)GGPLOT2仪糖,并包含?54000顆鉆石,其中包括信息price
迫肖,carat
锅劝,color
,clarity
蟆湖,和cut
每顆鉆石的故爵。圖表顯示,高質(zhì)量切割的鉆石比低質(zhì)量切割的鉆石更多隅津。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))