R語言筆記(二)

5 高級數據管理

數據分析 BY 倫大錘   閱讀量 1,948css

相對於基本數據管理,此處咱們將接觸到R中多種數學、統計和字符處理函數,學習如何本身編寫函數,包括循環和條件執行語句,以及瞭解數據的整合和概述方法、重塑和重構方法。git

5.1 一個數據處理難題

要討論數值和字符處理函數,不妨先考慮一個數據問題。一組學生參加了數學、科學和英語考試,須要按照某種成績衡量指標將三門科目的成績組合起來並排序,將前20%的學生評定爲A,接下來20%的學生評定爲B,依次類推。最後,將全部學生按照字母順序進行排序並輸出。正則表達式

須要考慮的問題包括如下幾點:api

  1. 三科的均值和標準差相去甚遠,所以求平均值顯然沒有意義。在組合多門成績以前,必須將其變換爲可比較的單元;
  2. 將三科成績組合以後,須要肯定一種標準來評定學生的排名;
  3. 表示姓名的字段只有一個,使得排序任務複雜化。爲了正確地將其排序,須要將姓和名拆開。

5.2 數值和字符處理函數

R中數據處理最爲重要的函數包括數值(數學、統計、機率)函數和字符處理函數。數組

數學函數

經常使用的數學函數包括:app

  • abs(x):絕對值;
  • sqrt(x):平方根;
  • ceiling(x):不小於x的最小整數;
  • floor(x):不大於x的最大整數;
  • trunc(x):向0的方向截取x的整數部分;
  • round(x, digits=n):將x舍入爲指定位的小數;
  • signif(x,digits=n):將x舍入爲指定的有效數字位數;
  • cos(x)、sin(x)、tan(x)、acos(x)、asin(x)、atan(x)、cosh(x)、sinh(x)、tanh(x)、acosh(x)、asinh(x)、atanh(x):三角函數;
  • log(x,base=n):對x取以n爲底的對數;
  • log(x):對x取以e爲底的對數;
  • log10(x):對x取以10爲底的對數;
  • exp(x):e的指數函數。

統計函數

經常使用的統計函數包括:ide

  • mean(x):平均數;
  • median():中位數;
  • sd(x):標準差;
  • var(x):方差;
  • mad(x):絕對中位差;
  • quantile(x,probs):求分位數,其中x爲待求分位數的數值型向量,probs爲一個由[0,1]之間的機率值組成的數值向量;
  • range(x):求值域;
  • sum(x):求和;
  • diff(x,lag=n):滯後差分;
  • min(x):求最小值;
  • max(x):求最大值;
  • scale(x,center=TRUE,scale=TRUE):爲數據對象x按列進行中心化或標準化。

其中許多函數都提供了豐富的可選參數,能夠進一步影響輸出結果。例如如下截尾平均數,丟棄了最大5%和最小5%的數據和全部缺失值後獲得算數平均值。函數

如下代碼演示了計算某個數值向量均值和標準差的兩種方式:工具

不難發現,R中公式的寫法和相似Matlab的矩陣運算語言有着許多共同之處。性能

使用如下代碼對矩陣或數據框的數值列進行均值爲一、標準差爲0的標準化:

或者任意均值和標準差:

若是僅對指定列處理,則使用transform()函數:

機率函數

概覽函數和統計函數相似,可是一般用來生成特徵已知的模擬數據,以及在用戶編寫的統計函數中計算機率值。

R中的每一個概覽函數都對應四個具體函數:d(密度函數)、p(分佈函數)、q(分位數函數)和r(生成隨機數)。

R經常使用機率函數

以正態分佈爲例,若是不指定均值和標準差,將會生成標準正態分佈(均值爲0,標準差爲1),相應的密度函數(dnorm)、分佈函數(pnorm)、分位數函數(qnorm)和隨機生成函數(rnorm)分別以下。

在每次生成僞隨機數的時候,函數都會使用一個不一樣的種子,所以也會產生不一樣的結果。能夠經過函數set.seed()顯式指定種子,使得以前的結果能夠重現(reproducible)。重現數據有助於建立會在將來取用的,以及可與他人分享的隨機示例數據。

使用MASS包中的mvrnorm()函數能夠生成來自給定均值向量和協方差矩陣的多元正態分佈,如下是一個生成知足指定三元正態分佈的例子。

字符處理函數

數學和統計函數用於處理數值型數據,而字符處理函數用於從文本型數據中抽取信息。

  • nchar(x):計算x中的字符數量;
  • substr(x, start, stop):提取或替換子串;
  • grep(pattern, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某種模式,fixed=FALSE則pattern爲一個正則表達式,不然pattern爲一個文本字符串,返回值爲匹配的下標;
  • sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某種模式並替換;
  • strsplit(x, split, fixed=FALSE):在split處分隔字符向量x中的元素;
  • paste(…, sep=」」):鏈接字符串,分隔符爲sep。paste(「x」, 1:3, sep=」」)返回值爲c(「x1」, 「x2」, 「x3」),paste(「x」, 1:3, sep=」M」)返回值爲c(「xM1」, 「xM2」, 「xM3」);
  • toupper(x):大寫轉換;
  • tolower():小寫轉換。

其餘實用函數

  • length(x):x的長度;
  • seq(from, to, by):生成一個序列,by爲步長;
  • rep(x, n):將x重複n次;
  • cut(x ,n):將連續型變量x分割爲n個水平的因子;
  • pretty(x, n):經過選取n+1個等間距的取整值,將一個連續型變量分割爲n個區間;
  • cat(…, file=」mayflies」, append=TRUE):鏈接…中的對象,並將其輸出到屏幕上或文件中。

在R中,函數能夠應用到一系列數據對象上,包括標量、向量、矩陣、數組和數據框(和Matlab相似)。若是但願函數應用於矩陣的各行或者各列,能夠考慮apply()函數。

MARGIN是維度的下標,1表示行、2表示列,FUN能夠是內置函數或者你本身編寫的函數,…爲可選參數。

和apply()應用於矩陣同樣,lapply()和sapply()則將函數應用於列表上。

5.3 數據處理難題的一套解決方案

回到咱們以前的問題,組合三門成績、按衡量指標排名、按區間分段打分、按姓名排序。

最後查看roster,你應當獲得以下結果。

學生成績數據處理結果

5.4 控制流

在正常狀況下,R程序中的語句是從上至下執行的。固然有時候你須要控制程序的執行流,即便用條件和循環。

爲了理解貫穿接下來內容的語法示例,請牢記如下概念:

  • 語句(statement)是一條單獨的R語句或一組複合語句(包含在{}中的一組R語句,使用分號分割);
  • 條件(cond)是一條最終被解析爲邏輯值的表達式;
  • 表達式(expr)是一條數值或字符串的求值語句;
  • 序列(seq)是一個數值或字符串序列。

重複和循環

循環結構重複地執行一個或一系列語句,直到某個條件再也不爲真,循環結構包括for循環和while循環。

在如下的例子中,單詞Hello被輸出了10次。

使用循環的時候,記得在循環裏修改標記量,避免致使死循環。

在處理大數據集中的行和列時,R中的循環可能比較低效耗時,應該儘量使用R中內建的數值/字符處理函數和apply()族函數。

條件執行

在條件執行結構中,一條或一組語句僅在知足指定條件時執行。條件執行結構包括if-else、ifelse和switch。

再給出一個使用switch的例子,雖然簡單但清晰說明了switch的使用方法。

5.5 用戶自編函數

R最大的優勢之一就是支持用戶自行添加函數,R中許多函數也是基於已由函數構成的,一個函數的結構大概以下:

函數中的對象只在函數內部使用(記得{}的做用嗎?),返回對象的數據類型是任意的,從標量到列表皆可。

要查看此函數的運行狀況,則須要生成一些測試數據並調用。

在所得結果中,y$center爲均值(0.00184),y$spread爲標準差(1.03),而且沒有輸出結果;z$center爲中位數(-0.0207),z$spread爲絕對中位差(1.001),而且還會在屏幕上打印信息。

再來看一個使用了switch的用戶自編函數,該函數可讓用戶選擇輸出當天日期的格式。

switch中的最後一條語句給出瞭如何處理錯誤(或其餘意料以外)的輸入。除此以外,還有一些函數能夠用來爲函數添加錯誤捕獲和糾正功能,如使用warning()生成一條錯誤提示信息,用message()生成一條診斷信息,用stop()中止當前表達式的執行並提示錯誤。若是但願瞭解更多關於調試程序的內容,請閱讀Duncan Murdoch整理的「Debugging in R」。

5.6 整合與重構

R中提供了許多用於整合(aggregate)和重塑(reshape)數據的強大方法,整合數據是指將多組觀測替換爲根據這些觀測計算的描述性統計量,重塑數據是指經過修改數據的結構(行和列)來決定數據的組織方式。

如下例子中,將會使用已包含在R基本安裝中的數據框mtcars。該數據集從Motor Trend雜誌(1974)提取,描述了34種車型的設計和性能特色(汽缸數、排量、馬力、每加侖汽油行駛的英里數)。

轉置

使用函數t()便可對一個矩陣或數據框進行轉置,對於後者,行名將成爲列名。

整合數據

在R中使用一個或多個by變量和一個預先定義好的函數來整合(collapse)數據十分容易。

其中x爲待整合的數據對象,by是一個變量名組成的列表,這些變量將被去掉以造成新的觀測,FUN是用來計算描述性統計量的標量函數,它將被用來計算新觀測中的值。如下代碼根據汽缸數和檔位數整合mtcars數據,並返回各個數值型變量的均值。

將會獲得如下結果。如何理解呢?例如第一行,擁有4個氣缸和3個檔位的車型,每加侖汽油行駛英里數(mpg)均值爲21.5。須要注意的是,by中的參數必須寫在一個列表中(即便只有一個參數)。

aggregate函數處理結果

Reshape包

reshape包是一套重構和整合數據集的萬能工具。因爲reshape包並未內置在R的標準安裝中,因此有必要經過install.packages(「reshape」)進行安裝。

咱們的操做大概包括兩部分:融合(melt),使得每一行都是一個惟一的標識符和變量的組合;重鑄(cast),將數據集變成任何須要的形狀。接下來代碼中,將處理如下樣例數據。

測試樣例數據

融合

融合使得每一個測量變量獨佔一行,行中必須帶有惟一肯定該測量的標識符變量。

注意,必須指定要惟一肯定每一個測量所需的變量(ID和Time),而表示測量變量名的變量(X1和X2)將由程序自動建立。

既然已經擁有了融合後的數據,如今即可以使用cast()函數將其重鑄爲任意形狀了。

重鑄

cast()函數讀取已融合的數據,並使用提供的公式和一個(可選的)用於整合數據的函數將其重鑄。

接受的公式形如:

rowvar1+rowvar2+…定義了要去掉的變量集合,以肯定各行的內容;colvar1+colvar2+…定義了要去掉的變量集合,以肯定各列的內容。下圖給出了使用cast()函數處理樣例數據的例子。

melt-cast使用示例

6 基本圖形

數據分析 BY 倫大錘   閱讀量 1,059

分析數據要作的第一件事情,就是觀察它。對於每一個變量,哪些值是最多見的?值域是大是小?是否有異常觀測?變量能夠爲連續型或類別型,咱們將探索如何使用條形圖、餅圖、扇形圖、直方圖、核密度圖、箱線圖、小提琴圖和點圖等來分析和展現變量。

6.1 條形圖

條形圖經過垂直或水平的條形來展現類別型變量的分佈(頻數)。

其中的height是一個向量或一個矩陣。在接下來的例子中,將使用到vcd包中帶有的Arthritis數據框,其描述了一項探索類風溼性關節炎新療法研究的結果。

簡單的條形圖

當height爲一個向量時,向量值便肯定了各條形的高度並繪製一幅垂直的條形圖。使用參數horiz=TRUE則生成一幅水平條形圖,還可使用main、xlab和ylab等圖形參數。

在關節炎研究中,變量Improved記錄了對每位接受了安慰劑或藥物治療的病人的治療效果。其中28人有了明顯改善,14人有部分改善,而42人沒有改善。

其實若是要繪製的類別型變量是一個因子或有序型因子,就能夠直接使用函數plot()快速建立一幅垂直條形圖。因爲Arthritis$Improved是一個因子,所以如下代碼也能夠達到一樣效果。

堆砌條形圖和分組條形圖

若是height是一個矩陣而不是一個向量,則繪圖結果將是一幅堆砌條形圖或分組條形圖。beside默認爲FALSE表示堆砌,不然將分組。考慮治療類型和改善狀況的列聯表:

第一個barplot函數繪製了一幅堆砌條形圖,而第二個繪製了一幅分組條形圖。圖中圖例和條形圖疊加了,不過這能夠經過格式化和放置圖例的方法解決,故不用擔憂。

均值條形圖

條形圖並不必定要基於計數數據或頻率數據,也可使用數據整合函數並將結果傳遞給barplot()函數,來建立表示均值、中位數、標準差等條形圖。

條形圖的微調

有多種方法能夠微調條形圖的外觀:

  • 隨着條數的增多,可使用cex.names減少字號避免標籤重疊;
  • name.arg容許用一個字符向量指定條形的標籤名;
  • 其餘通用圖形參數。

如下代碼中,旋轉了條形的標籤(las)、修改了標籤文本、增長了y邊界的大小(mar)、縮小了字體大小(cex.names)。

棘狀圖

還有另外一種特殊的條形圖:棘狀圖(spinogram)。棘狀圖對堆砌條形圖進行了重縮放,使得每一個條形的高度均爲1,每一段的高度表示所佔比例。棘狀圖可由vcd包中的spine()繪製:

經過棘狀圖能夠看出,治療組和安慰劑組相比,得到顯著改善的患者比例更高。

6.2 餅圖

雖然餅圖在商業世界中使用普遍,可是多數統計學家卻並不支持它,由於相對於餅圖的面積,人類對條形圖或點圖中的長度判斷更加精確。也許是由於這個緣由,R中餅圖的選項和其餘統計軟件相比十分有限。

其中x是一個非負數值向量,表示各個扇形的面積,labels則是各扇形標籤的字符型向量。如下代碼繪製了三幅餅圖,最簡單的餅圖、顯示百分比的餅圖和三維餅圖。

餅圖讓比較各扇形的值變得困難,除非這些值被附加在標籤上。爲了彌補這一缺點,產生了一種餅圖的變種:扇形圖。扇形圖爲用戶提供了一種同時展現相對數量和相互差別的方法,各個扇形相互疊加而且擁有不一樣半徑,從而使得全部扇形都是可見的。

6.3 直方圖

直方圖經過在X軸上將值域分割爲必定數量的組,在Y軸上顯示相應值的頻數,展現了連續型變量的分佈。使用如下函數建立直方圖:

x爲一個由數據值組成的數值向量,參數freq=FALSE表示根據機率密度而不是頻數繪製圖形,參數breaks用於控制組的數量。

第一幅直方圖未指定任何選項,共建立了五個組而且顯示了默認的標題和座標軸標籤;第二幅直方圖共12個分組,並使用紅色填充條形;第三幅直方圖保留了第二幅圖的內容,併疊加了一條密度曲線(density)和軸須圖(rug),密度曲線是數據分佈一個的核密度估計,而軸須圖是實際數據值的一種一維呈現方式;第四幅圖和第二幅相似,還有一條疊加的正態曲線和一個將圖形圍繞起來的盒型。

6.4 核密度圖

核密度估計是用於估計隨機變量機率密度函數的一種非參數方法。

其中x爲一個數值型向量,因爲plot()函數會建立一幅新的圖形,因此要向一幅已經存在的圖形上疊加一條密度曲線時,可使用lines()函數。

第一幅圖是默認設置建立的最簡圖形,而第二幅圖中添加了標題,並將曲線修改爲藍色、使用實心紅色填充了曲線下方的區域、添加了棕色的軸須圖。

使用sm包中的sm.density.compare()函數能夠向圖形疊加兩組或更多核密度圖,格式爲:

其中x爲一個數值型向量,factor爲一個分組變量。如下代碼比較了擁有4個、6個或8個汽缸車型的每加侖汽油行駛英里數。

相關文章
相關標籤/搜索