R數(shù)據(jù)科學(xué)之日常積累

劉小澤開始寫于18.9.4晚,這必定是一個(gè)持續(xù)性更新的過程
昨天jimmy一發(fā)朋友圈,單篇閱讀量很快超過了我們的關(guān)注人數(shù)??開心之余,今晚拿起了數(shù)據(jù)科學(xué)這本書看了起來~

正如書的安排,將第一部分分給了可視化,確實(shí)讓人耳目一新,學(xué)習(xí)R可視化并且用最好用的ggplot2工具,讓學(xué)習(xí)變成一種享受。
我會(huì)按學(xué)習(xí)的內(nèi)容梳理重點(diǎn)問題

前言

數(shù)據(jù)處理流程

需要整潔的數(shù)據(jù)tidy data

每一列是一個(gè)變量,每一行是一個(gè)觀測

需要安裝tidyverse包

包括了ggplot2/tibble/readr/purrr/dplyr,使用tidyverse_update()檢查更新

指定對象

包的名稱后用兩個(gè)冒號,如dplyr::mutate()

ggplot繪圖

繪圖模版

ggplot(data = <DATA>) +
    <GEOM_FUNCTION>(mapping = aes(<MAPPING>))

這個(gè)思路很棒!也講出了ggplot的作圖邏輯

  • 無論什么圖,首先需要輸入的就是數(shù)據(jù)集<DATA> ,這時(shí)繪制的是一張白紙;
  • 接下來就看你需要做什么圖了,就是選擇幾何對象的過程,比如要做散點(diǎn)圖,就將<GEOM_FUNCTION> 替換成geom_point;
  • 有了幾何對象,接下來就要考慮,我們數(shù)據(jù)集中的數(shù)據(jù)怎么映射上去呢,x軸代表什么,y軸又代表什么呢?這個(gè)就是<MAPPING> 需要做的事情——指定映射變量;
  • 指定完變量后,就要想,怎么設(shè)置字體大小(size),形狀(shape)、【填充|邊框】顏色(fill | color)、透明度(alpha)等等,這些叫圖形屬性,也都是在<GEOM_FUNCTION> 中完成;
  • 繪制完一個(gè)圖層后,當(dāng)然可以繼續(xù)新加圖層,覆蓋到原來之上(比如這里的散點(diǎn)圖)

繪圖注意

  1. 不要將無序變量映射為有序圖形屬性,什么樣的變量就用什么樣的屬性

    有序圖形屬性包括:size;無序?qū)傩园ǎ簊hape、size
    進(jìn)行圖形屬性設(shè)置時(shí),有的屬性是有序的圖形屬性,比如size,就是它是和數(shù)據(jù)的大小順序有關(guān)的,反映出來的結(jié)果應(yīng)該是:數(shù)值越大,點(diǎn)的大小越大。
    但是如果用一個(gè)無序的變量(比如mpg數(shù)據(jù)集中的class變量,它只是一個(gè)分類的作用)去映射size,結(jié)果就會(huì)根據(jù)不同類別的class表現(xiàn)大小,基本上結(jié)果是看不出來什么問題的

    ggplot(data = mpg)+
      geom_point(mapping = aes(x = displ, y = hwy, size= class))
    
不好的搭配
  1. ggplot2最多同時(shí)使用6種形狀

  2. 繪圖模版的倒數(shù)第二條中,設(shè)置顏色用字符串,設(shè)置大小用毫米,設(shè)置形狀用數(shù)值。關(guān)于形狀:

    空心-邊界顏色-color 【0-14】
    實(shí)心-填充顏色-color;【15-20】
    填充-邊界顏色-color,填充顏色-fill【21-24】
    
形狀設(shè)置
  1. 一行代碼寫不完,可以用+然后換行,但是+必須在結(jié)尾

  2. 圖形分面:特別適合添加分類變量
    單個(gè)變量:facet_wrap(~變量,nrow=)
    兩個(gè)變量:facet_grid(變量1~變量2)

  3. ggplot中有大于30種幾何對象,就是做出來的圖形,但是對于不用的圖進(jìn)行設(shè)置的屬性也有些差別,比如:帶線的圖就不能用點(diǎn)圖的shape設(shè)置形狀,可以用linetype設(shè)置實(shí)線、虛線等

  4. show.legend=T/F設(shè)置是否顯示圖例

  5. 創(chuàng)建表格可以用

    demo <- tribble(
     ~a, ~b,
     "bar_1", 20,
     "bar_2", 30,
     "bar_3", 40)
    
  6. 在<GEOM_FUNCTION>()中還可以添加統(tǒng)計(jì)變換

     #stat_summary:匯總統(tǒng)計(jì),主要計(jì)算數(shù)據(jù)集合的最大值、最小值、平均數(shù)等;
     #stat_bin:封箱統(tǒng)計(jì),將數(shù)據(jù)劃分成一個(gè)個(gè)的區(qū)域,然后在外面嵌套匯總統(tǒng)計(jì);
     #stat_smooth:線性回歸、非線性回歸以及各種平滑插值算法,用于查找數(shù)據(jù)的規(guī)律;
     #stat_density:樣本估計(jì)總體的概率密度;
    
  7. 位置調(diào)整position

    #選項(xiàng)1.identity
    ggplot(diamonds,aes(x=cut, fill = clarity))+
      geom_bar(position = "identity", alpha = 1/4) #設(shè)置透明度
      
    ggplot(diamonds,aes(x=cut, color = clarity))+
      geom_bar(position = "identity", fill=NA) #選擇不填充,也就是完全透明,只有邊框
    
    #選項(xiàng)2.fill(和堆疊相似,但各組高度相同)方便比較比例
    ggplot(diamonds, aes(x=cut, fill =clarity))+
      geom_bar(position = "fill")
     
    #選項(xiàng)3.dodge(各組條形并列放置)方便比較數(shù)值
    ggplot(diamonds, aes(x=cut, fill = clarity))+
      geom_bar(position = "dodge", alpha=1/2)
     
    #選項(xiàng)4.適合散點(diǎn)圖的jitter(隨機(jī)抖動(dòng))避免因數(shù)據(jù)四舍五入而使部分值重疊
    #不加抖動(dòng)是這樣
    ggplot(mpg)+geom_point(aes(x= displ, y = hwy))
    #加了是這樣,可以看出數(shù)據(jù)聚集模式
    ggplot(mpg)+geom_point(aes(x= displ, y = hwy), position = "jitter")
    #快速實(shí)現(xiàn)用geom_jitter
    ggplot(mpg)+geom_jitter(aes(x= displ, y = hwy))
    
  8. 作出一條參考線:對角線geom_abline() ;水平geom_hline; 豎直geom_vline

基礎(chǔ)工作流

賦值

雖然=也可以,還是推薦使用<- 。因?yàn)?后來可能會(huì)引起混淆

快速輸入<-,用Alt +減號

對象名稱

小寫字母,_分隔

調(diào)取快捷鍵幫助

alt + shift + K

學(xué)習(xí)dplyr

五大金剛:
filter()按值篩選觀測值;arrange()行重排序;select()按名稱選取變量;mutate()使用現(xiàn)有變量創(chuàng)建新變量;summarize()獲得摘要
【工作方式:函數(shù)(數(shù)據(jù)框,變量名稱+操作) = 》結(jié)果返回新數(shù)據(jù)框】

一種設(shè)定:group_by(),可以改變上述函數(shù)的作用范圍

#先加載參考數(shù)據(jù)集——航班概況
install.packages("nycflights13")
library(nycflights13)

filter

想同時(shí)輸出結(jié)果并保存在一個(gè)變量中,可以這樣:
(dec25 <- filter(flights, month == 1, day == 1))
比較數(shù)值—浮點(diǎn)數(shù)較特殊
> sqrt(2)^2 == 2
[1] FALSE
#計(jì)算機(jī)使用有限位數(shù)運(yùn)算,因此sqrt(2)^2結(jié)果是個(gè)近似值,要采用near函數(shù)來判斷
> near(sqrt(2)^2, 2)
[1] TRUE
邏輯運(yùn)算
#找到11月或者12月的航班
filter(flights, month == 11| month == 12)
#但是,如果這樣寫:
filter(flights, month == 11| 12) #結(jié)果大不同
# 因?yàn)槌绦蛳瓤吹氖?1 | 12,返回邏輯值是TRUE, 而TRUE代表數(shù)字1,因此結(jié)果就是相當(dāng)于 filter(flights, month == 1),會(huì)找到1月份的航班
NA == NA => NA

NA是什么?=》not available的缺失值

打眼看去,很奇怪的表達(dá),判斷NA == NA,怎么結(jié)果還是NA?
按現(xiàn)實(shí)情況去解釋就好理解了:豆豆的年齡未知(dou <- NA),花花的年齡也未知 (hua <- NA),那么豆豆花花的年齡一樣嗎(dou == hua?),不知道啊,所以還是NA

當(dāng)然,要判斷NA值,用is.na()

filter()默認(rèn)只保留TRUE的行,排除FALSE、NA,如果要保留NA,例如
filter(df, is.na(x) |x>1 )

簡寫 %in%

選出x是y中的一個(gè)值的所有行

filter(flights, month %in% c(11,12)) #就是上面的簡寫
簡化篩選條件
#如果要找出發(fā)或者到達(dá)延誤時(shí)間小于2小時(shí)的航班【兩種方法】
filter(flights, !(arr_delay >120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <=120)
另一個(gè)簡單的選取數(shù)據(jù)函數(shù)between()

可以用于選取數(shù)據(jù)范圍between(x, left, right)

參數(shù)left,right表示數(shù)據(jù)左邊和右邊范圍,返回結(jié)果是邏輯值


歡迎關(guān)注我們的公眾號~_~  
我們是兩個(gè)農(nóng)轉(zhuǎn)生信的小碩,打造生信星球,想讓它成為一個(gè)不拽術(shù)語、通俗易懂的生信知識平臺(tái)。需要幫助或提出意見請后臺(tái)留言或發(fā)送郵件到Bioplanet520@outlook.com

Welcome to our bioinfoplanet!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容