經過前面幾次推文的學習,相信大家對R語言已經有了一個大概的了解,同時也初步感受了R語言在數據處理領域的強大功能,不過實話實說,前面的內容還只是R語言應用的冰山一角而已。從這次推文開始,我們就要正式開始接觸R語言對數據處理的強大能力。
在正文內容開始之前,我先給大家推薦一個文檔https://google.github.io/styleguide/Rguide.xml
相信很多同學在前幾次推文的指導下,練習R代碼編寫的時候會發現,R語言和其他程式語言不太一樣的地方,比如:<- 和 = 都可以給變量賦值,兩者都可以作為賦值符,兩者我該用哪個?同時,有些操作符前後有空格,有些又沒有,到底該怎麼寫才對?除此之外,R語言的換行和縮進似乎也不像python那麼嚴格。那我們平時自己寫代碼的時候應該遵循什麼樣的規則呢?
上面提到的這個文檔就可以解答大家的這些疑問。這個文檔是Google’s R Style Guide,眾所周知,醫生在臨床上工作有臨床指南,那程式設計師工作也有「指南」,上面的這個文檔就是我們寫R代碼的指南。具體我這裡不展開來講,希望大家好好看看,務必遵守!!!
話不多說,我們進入這次課程的主要內容,上節課中完成了R語言中的數據導入工作,那麼這次課程的主要內容就是給大家介紹一些數據管理和操作的基本函數或語句。
1、本節內容重點內容較多,
務必緊跟紅色標記。
2、測試數據及代碼
見文末客服小姐姐二維碼。
一般來說,創建新變量是項目中必不可少的步驟。舉個例子,有一個數據框mydata,其中有兩列變量x1,x2。現在要求創建兩個新的變量x3,x4,其中x3是變量x1,x2的加和,x4是x1,x2的均值。下面有三個實現方式的示例:
圖1:創建新變量的三種方式。
第一種方法是通過賦值操作在數據框mydata中生成新的兩列;第二種方法是通過attach函數加載mydata,賦值生成新的兩列數據,再detach取消加載mydata數據框;第三種方法是通過transform函數把數據列合併在一起。大家可以根據自己的習慣來選擇其中一種方法實現(跟大家講個悄悄話:我喜歡第一種方法,直接明了)。同時我們也跟大家講一下R裡面的常用運算符:加(+)、減(-)、乘(*)、除(/)、求冪(^或者**)、求餘(%%)、整數除法(%/%,如5%/%2=2)。
變量的重命名很好理解,變量的重編碼的含義是根據一個或者一組變量的現有值創建新值的過程,比如,項目中要求將錯誤的數據改為準確值、將學生的百分製成績改為等級製成績等等。這個過程中邏輯運算發揮了很重要的作用。說到邏輯運算,就是對TRUE和FALSE兩個邏輯變量的運算,邏輯運算符包括&(與)、| (或)、!(非)三種。我們以如圖2中的一組數據來進行示範。
圖2:示例數據
首先我們把age=99的數據改為缺失數據,然後將age重編碼為等級制變量agecat,代碼如圖3。
圖3:變量的重編碼
這樣我們發現處理完之後數據有了變化:
圖4:注意最後一列agecat。
實際上變量重編碼是一個很複雜的問題,絕不僅僅是像上面兩步操作那麼簡單的。其中,car包中的recode()和doBy包中的recodevar()、R語言中自帶的cut(),這三個函數都是很受歡迎的變量重編碼函數。
相比於重編碼,重命名就不那麼神秘了,通過names()函數可以更改數據框的行名和列名。下面給大家舉幾個變量重命名的方法,大家可以自己動手試一下,感受一下這三個語句的效果。
圖5:變量重命名的方法。
*plyr包是一個集合了很多數據集操作函數的R包,大家可以查看其幫助文檔進一步學習。
幾乎所有項目中,都存在缺失值,在R中缺失值用NA代替(前面我們已經見過了)。R語言提供了一個簡單而重要的函數is.na()來監測數據集中的缺失值。下面是該函數的一個使用實例。
圖6:使用is.na()函數
數據集leadership中缺失值NA的位置都被標記上了TRUE。
這個函數簡單在於用法簡單易記,重要在於R語言中不存在x == NA來判斷變量x是否為缺失值的用法!!!值得一提的是,NA只是表示缺失值,和無效運算產生的結果NaN是不一樣的。
我們在前面已經實驗過了重編碼某些值為缺失值的用法,就是將age為99的值標記為缺失值的步驟(如圖3)。這一步雖然很簡單,但在一些項目中如果遺漏了這個步驟,會對結果產生巨大的影響!
在識別和編碼了缺失值之後,我們該怎麼處理這些可惡的缺失值呢?缺失值的插補是一個非常複雜的問題,如果你的數據有很大一部分都是缺失值,你或許應該先去問問提供數據的人,為什麼會有缺失值。或者,等我們後續課程專門講解缺失值插補的操作。如果你的數據中只是存在很小一部分缺失值,直接刪除這些麻煩的缺失值是一個理想的選擇。R語言中提供了函數na.omit()來刪除帶有缺失值的行(如圖7)。
圖7:函數na.omit()的使用。
在R語言中的很多數值函數都有一個na.rm=TRUE的可選參數,比如函數sum()。這個參數可以在計算之前就移除缺失值並使用剩餘值計算(如圖8)。
圖8:函數sum()中na.rm=TRUE的舉例
總之,缺失值的處理是一個很複雜的問題,在刪除缺失值對總體影響很小的情況下,這是最理想的選擇。
學過任何一門程式語言的同學都不會對數據類型陌生,有些語言中的數據類型轉換甚至難倒了很多人。R語言中不會出現這種情況了,它為我們提供了一系列用來判斷某個對象的數據類型和將其轉換為另一種數據類型的函數,如圖9。
圖9:類型判斷與轉換函數。
下面圖10是一個簡單的示範。
圖10:數據類型判斷和轉換函數的使用
數據中比較特殊的一類就是日期數據,R語言中日期值通常以字符串的形式輸入,然後轉換為數值形式存儲。類似上面用到的as.datatype()函數,函數as.Date()用於執行這個轉換過程,具體用法為:as.Date(x, 「input_format」)。參數input_format給出讀入日期x的適當格式。具體用法見下圖11。日期格式的列表如圖12,表中詳細羅列了不同日期格式的格式符號。
圖11:日期的轉換
圖12:日期格式
數據的排序在R語言中可以說比在Excel中還要簡單了,簡單給大家展示一下函數order()的用法。如圖13,分別按照age和同時按照gender、age對leadership數據集進行了排序。此外,排序的函數還有sort()和rank(),可以自制試試看不同函數的用途哦。
圖13:函數order()的用法。
有時候數據並不是一個整體,需要自己整合一下。R語言中常用的合併數據集的函數有merge()、cbind()、rbind()。其中函數cbind()是將兩個矩陣或者數據框直接橫向合併,要求被合併的兩個對象有同樣的行數。
如果要在數據框中添加行(或者理解為將兩個數據框縱向合併),使用函數rbind(),要求兩個數據框有相同的變量,不過順序不必要相同。一般用於向數據框中添加新的觀測。
函數merge()的用法就稍微複雜一點,下面還是用leadership數據集給大家舉一個簡單的例子,如圖14。
圖14:函數merge()的使用
簡單來說,就是把leadership和leadership.new兩個數據集按照變量managerID、date進行了合併,用於給觀測添加新的數據。
在前面介紹R語言中數據類型的推文中我們已經展示過選擇數據框中某幾列數據的方法,下面我們為大家展示選擇或者剔除變量(觀測)的幾種常用方法。如圖15.
圖15:數據取子集的操作實例。
篇幅有限,就不給大家展示代碼的運行結果了。圖裡面值得注意的是%in%這個運算符,它的主要功能是判斷一個向量中的元素是否在另外一個向量中。還有一個重點就是函數subset()。這個函數可以獨立解決取一部分觀測和一部分變量的工作,是數據集取子集最簡單的方法了。
相信大家都有體會,我們的難度在逐漸增大。本次課程的重點是R中的常用數據操作,這個是數據挖掘的基礎,其實說難也不難,掌握幾個函數,後面的操作就簡單多了。希望大家不要氣餒,堅持學習,精通R語言指日可待哦。
本期乾貨
·
!R語言數據操作示例及數據!
關注科研貓公眾號,在後臺回復關鍵詞「R5」獲取本篇推文乾貨連結,獲取後請儘快轉存或收藏以免連結過期。
更多科研新鮮資訊、文獻精讀和生物信息技能
關注科研貓