《R語言實戰》第五章讀書筆記

第五章主要對常用函數進行介紹,並將函數應用在一個實際例子中。

一、數值和字元處理函數

1、數字函數

2、統計函數

上表中quantile(x,probs) 求分位數。其中x 為待求分位數的數值型向量,probs 為一個由[0,1]之間的概率值組成的數值向量

例如:求x 的30%和84%分位點

range(x) 求值域

3、數據的標準化

  • scale(x,center=TRUE,scale=TRUE)為數據對象x 按列進行中心化(center=TRUE)或標準化(center=TRUE,scale=TRUE);默認情況下,函數scale()對矩陣或數據框的指定列進行均值為0、標準差為1的標準化:

  • 要對每一列進行任意均值和標準差的標準化,可以使用如下的代碼:newdata <- scale(mydata)*SD + M其中的M是想要的均值,SD為想要的標準差。在非數值型的列上使用scale()函數將會報錯。
  • 要對指定列而不是整個矩陣或數據框進行標準化,你可以使用這樣的代碼:newdata <- transform(mydata, myvar =scale(myvar)*10+50),此句將變數myvar標準化為均值50、標準差為10的變數。

4、概率函數

概率函數形如 :

[dpqr]distribution_abbreviation()

其中第一個字母表示其所指分布的某一方面:

d = 密度函數(density)

p = 分布函數(distribution function)

q = 分位數函數(quantile function)

r = 生成隨機數(隨機偏差)

distribution_abbreviation()為概率分布函數,常用在概率分布函數如下表:

默認情況下為 標準正態分布(均值為0,標準差為1)

5、 設定隨機數種子

runif()函數生成0到1區間服從均勻分布的偽隨機數。但是執行不同次,出現的結果不同,若需要顯示指定一個種子,就用到set.seed()函數。例如,第一次執行runif(5),生成5個隨機數

第二次再執行一次,結果如下:

當手動設定種子之後,就能顯示相同的結果了

5、 生成多元正態數據

MASS包中的mvrnorm()函數可以獲取來自給定均值向量和協方差陣的多元正態分布的數據,

mvrnorm(n,mean, sigma)其中n是你想要的樣本大小,mean為均值向量,而sigma是方差-協方差矩陣(或相關矩陣)。

例如:從以下參數的三元正態分布中抽取500個觀測,代碼如下:

上面一句代碼表示mydata有500個觀測,3個變數。結果我們取10行顯示如下圖:

7、字元處理函數

其中函數grep(),sub(),strsplit()能夠搜索某個字元串(fixed=TRUE)或者正則表達式(fixed=FALSE),參數fixed默認為FALSE。

8、其他常用的函數有以下:

當這些函數應用在各種數據結構中時,可以對所有數據進行函數運算,也可以對行或者列進行函數運算。例如:

生成0到1區間的12個隨機數矩陣。若mean(c)則是全部12個元素的均值,結果如下:

用apply(x,MARGIN,FUN,…)則可以計算任何維度,其中x為數據對象,MARGIN是維度下標,1代表行,2代表列,FUN則是要應用的函數。計算每行的均值如下:

計算每列的如下:

二、控制流

R語言中的控制流與其他編程語言中的一樣,主要有

1、重複和循環

for結構:for循環重複地執行一個語句,直到某個變數的值不再包含在序列seq中為止

例:Hello被輸出的10次

while結構:while循環重複地執行一個語句,直到條件不為真為止。

I初始為10,執行一次輸出,i減1,直到不大於0時則跳出循環,不同語句之間用分號來分隔。

1、條件執行

if-else結構:

if (cond) statement #當cond為真則執行statement

if (cond) statement1 else statement2 #當cond為真則執行statement1,為假則執行statement2

例如:

ifelse結構:是if-else結構比較緊湊的向量化版本,其語法為:ifelse(cond, statement1, statement2),若cond為TRUE,則執行第一個語句;若cond為FALSE,則執行第二個語句。例如:

switch結構:switch根據一個表達式的值選擇語句執行。語法為:switch(expr,...)其中的...表示與expr的各種可能輸出值綁定的語句。

三、在R語言中也可以根據需要進行函數的自我編寫,格式為:

myfunction<-function(arg1,arg2,…){StatementsReturn(object)} 例子如下:

其中函數的對象只能在函數中使用,返回對象的數據類型是任意的。

四、整合和重構

1、轉置:即反轉行和列,使用函數t(),行名將變成列名。例子:

2、整合數據

在R中使用一個或多個by變數和一個預先定義好的函數來摺疊(collapse)數據是比較容易的。調用格式為:aggregate(x, by, FUN) 其中x是待摺疊的數據對象,by是一個變數名組成的列表,這些變數將被去掉以形成新的觀測,而FUN則是用來計算描述性統計量的標量函數,它將被用來計算新觀測中的值。

例如:

在這個例子中,將mtcars這個數據框中,以cyl和gear為條件,對數據進行均值的操作。在結果中Group.1和Group.2對應的即為cyl,gear的值,以第一行結果為例子,表示cyl為4和gear為3的所有mpg的值進行均值操作的結果為21.5。

3、reshape2包

1) reshape2包並未包含在R的標準安裝中,在第一次使用它之前需要使用install.packages("reshape2")進行安裝。

2) 融合:數據集的融合是將它重構為這樣一種格式:每個測量變數獨佔一行,行中帶有要唯一確定這個測量所需的標識符變數。必須指定要唯一確定每個測量所需的變數。

原始數據:

以ID和Time進行融合後的結果如下:

3)重鑄

dcast()函數讀取已融合的數據,並使用你提供的公式和一個(可選的)用於整合數據的函數將其重塑。調用格式為:newdata <- dcast(md, formula, fun.aggregate),其中的md為已融合的數據,formula描述了想要的最後結果,而fun.aggregate是(可選的)數據整合函數。例如:

五、問題解決

第五章一開頭的舉的案例可以通過本章學習的函數進行處理:

題目為:一組學生參加了數學、科學和英語考試。為了給所有學生確定一個單一的成績衡量指標,需要將這些科目的成績組合起來。另外,你還想將前20%的學生評定為A,接下來20%的學生評定為B,依次類推。最後,你希望按字母順序對學生排序。數據如表5-1所示。

解決方法:

此時roster為:

此時y的值為:

此時A級的學生則為大於等於百分數為80%的值(0.74),B則為score的值大於0.44小於0.74,則判斷代碼如下:

此時roster為:

此時的roster為:

最後進行排序:


推薦閱讀:

TAG:R編程語言 | 數據分析 |