R數據科學之日常積累

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

正如書的安排,將第一部分分給了可視化,確實讓人耳目一新,學習R可視化并且用最好用的ggplot2工具,讓學習變成一種享受。
我會按學習的內容梳理重點問題

前言

數據處理流程

需要整潔的數據tidy data

每一列是一個變量,每一行是一個觀測

需要安裝tidyverse包

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

指定對象

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

ggplot繪圖

繪圖模版

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

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

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

繪圖注意

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

    有序圖形屬性包括:size;無序屬性包括:shape、size
    進行圖形屬性設置時,有的屬性是有序的圖形屬性,比如size,就是它是和數據的大小順序有關的,反映出來的結果應該是:數值越大,點的大小越大。
    但是如果用一個無序的變量(比如mpg數據集中的class變量,它只是一個分類的作用)去映射size,結果就會根據不同類別的class表現大小,基本上結果是看不出來什么問題的

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

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

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

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

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

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

  5. 創建表格可以用

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

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

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

基礎工作流

賦值

雖然=也可以,還是推薦使用<- 。因為=后來可能會引起混淆

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

對象名稱

小寫字母,_分隔

調取快捷鍵幫助

alt + shift + K

學習dplyr

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

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

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

filter

想同時輸出結果并保存在一個變量中,可以這樣:
(dec25 <- filter(flights, month == 1, day == 1))
比較數值—浮點數較特殊
> sqrt(2)^2 == 2
[1] FALSE
#計算機使用有限位數運算,因此sqrt(2)^2結果是個近似值,要采用near函數來判斷
> near(sqrt(2)^2, 2)
[1] TRUE
邏輯運算
#找到11月或者12月的航班
filter(flights, month == 11| month == 12)
#但是,如果這樣寫:
filter(flights, month == 11| 12) #結果大不同
# 因為程序先看的是11 | 12,返回邏輯值是TRUE, 而TRUE代表數字1,因此結果就是相當于 filter(flights, month == 1),會找到1月份的航班
NA == NA => NA

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

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

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

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

簡寫 %in%

選出x是y中的一個值的所有行

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

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

參數left,right表示數據左邊和右邊范圍,返回結果是邏輯值


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

Welcome to our bioinfoplanet!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容