R語言學習筆記(三)——實用的內建函式

導語:

前兩期小編給大家介紹了R語言和Rstudio的安裝(),以及一個非常有用的R包dplyr(

R語言學習筆記(二)

)。此外,作為R語言的初學者也應該掌握一些基本函式,所以本期給大家介紹一些R中非常實用的內建函式,希望對大家有所幫助。

01

內建資料集

R語言中有很多內建的資料集,這些資料集儲存在datasets這個包中,包含了R中所有的資料型別。R會預設已經載入了這個包。我們可以用data()命令檢視R中所有內建的資料集,左邊是資料集的名稱,右邊是資料集的描述。

> data()Data sets in package ‘datasets’:AirPassengers Monthly Airline Passenger Numbers 1949-1960BJsales Sales Data with Leading IndicatorBJsales。lead (BJsales) Sales Data with Leading IndicatorBOD Biochemical Oxygen Demand

這裡介紹幾個十分常用的資料集,mtcars收集了美國32種汽車的11個指標,經常用於ggplot2作圖的示例資料;iris是一個非常有名的資料集,收集了3種鳶尾花花瓣和花萼的長寬資訊,是資料探勘中常用的示例檔案;state。x77收集了美國50個州的基本資訊,是畫熱圖的示例檔案。

02

內建函式

R中有很多實用的內建函式,這裡不做系統的介紹,僅列舉一些在資料分析中非常實用的函式。

(1)關於NA

對於一組資料來說,如果出現了缺失值,在R中是不能直接進行統計分析的,好在R中有專門針對缺失值的幾個函式,下面舉例說明。

> x <- c(1, 2, 3, 4, 4, NA)> mean(x)[1] NA

向量x中有NA值,看到直接對向量x求平均值結果是不對的,有兩種方法可以解決。

> mean(x, na。rm = T)[1] 2。8> mean(na。omit(x))[1] 2。8

第一種是在mean函式中新增na。rm = T引數,也就是計算時先將NA值移除;第二種是先用na。omit()函式移除掉x中的NA值,再計算平均值。

(2)兩個向量的關係

資料分析中經常需要找不同組之間的關係,這裡有幾個常用的函式。

交集(

intersect

> x1 <- c(1:5)> x2 <- c(3:7)> intersect(x1, x2)[1] 3 4 5

並集(

union

> union(x1, x2)[1] 1 2 3 4 5 6 7

匹配(

match

):返回向量1的元素在向量2中的位置

> match(x1, x2)[1] NA NA 1 2 3

表示x1的5個元素在x2中的位置分別為NA、NA、1、2、3。這個函式的意義在於生成一個索引向量,在資料框的篩選中會非常實用。

(3)基本統計函式

關於基本的統計函式如平均值、標準差等這裡不做系統介紹,這裡說幾個統計函式的特殊用法。

(a)生成隨機數

通常用runif(n, min, max)函式,這個函式生成均勻分佈的值,n為個數,min和max分別是最小值和最大值,預設引數為0和1。

> runif(5, 1, 10)[1] 7。236265 7。278368 2。847278 9。544132 6。884813> runif(5)[1] 0。6437805 0。2144422 0。4272817 0。6258470 0。6981409

(b)生成隨機整數

一個最簡單的辦法是round()和runif()函式連用,其中round()是按照四捨五入取整函式。如果要向上或者向下取整,可以使用ceiling()和floor()函式。

> round(0。5)[1] 0> round(1。2)[1] 1> round(runif(10))       #生成隨機的0,1向量 [1] 0 0 0 1 1 1 1 1 0 0> round(runif(10, 0, 2))   #生成隨機的0,1,2向量 [1] 0 1 0 1 2 0 2 0 2 1> ceiling(runif(10, -2, 1))  #生成隨機的-1,0,1向量 [1]  0 -1  1 -1  0 -1  0 -1  1  0> floor(runif(10, -1, 2)) [1]  1  0  1  1 -1  1 -1 -1  1 -1

後面幾種生成隨機向量的方式非常實用,原理就是先用runif()函式生成隨機數,然後再用round()函式取整數。基因型資料經常用0,1,2或者-1,0,1表示,我們可以用這種方式模擬基因型資料。

(c)正態分佈

用的最多的是rnorm(n, mean, sd)函式,生成n個符合某個正態分佈的隨機數。用法比較簡單,預設的平均值是0,方差是1。

> rnorm(5)[1] -1。7916223 1。7582387 0。2924384 0。3130404 -0。5076251> rnorm(5, 3, 1)[1] 1。968562 4。885262 4。634220 3。017137 3。990052

(4) 其他函式

R中還有不少常用的函式,這裡僅列舉三個。

(a)summary函式

這個函式是一個比較“萬金油”的函式,可以單獨對向量或者矩陣使用,會給出一些基本的統計量,包括極值、中位數、平均數等等。

> summary(1:10) Min。 1st Qu。 Median Mean 3rd Qu。 Max。 1。00 3。25 5。50 5。50 7。75 10。00> summary(matrix(10:15, nrow = 2)) V1 V2 V3 Min。 :10。00 Min。 :12。00 Min。 :14。00 1st Qu。:10。25 1st Qu。:12。25 1st Qu。:14。25 Median :10。50 Median :12。50 Median :14。50 Mean :10。50 Mean :12。50 Mean :14。50 3rd Qu。:10。75 3rd Qu。:12。75 3rd Qu。:14。75 Max。 :11。00 Max。 :13。00 Max。 :15。00

在一些統計分析中也經常使用summary()函式,比如下面的線性迴歸:

> x <- c(2, 2, 3, 4, 4)> y <- c(10, 20, 30, 40, 50)> fm <- lm(y ~ x)> summary((fm))

Call:

lm(formula = y ~ x)

Residuals:

1 2 3 4 5 -5。000e+00 5。000e+00 -1。776e-15 -5。000e+00 5。000e+00 Coefficients: Estimate Std。 Error t value Pr(>|t|) (Intercept) -15。000 9。037 -1。660 0。1955 x 15。000 2。887 5。196 0。0138 *——-Signif。 codes: 0 ‘***’ 0。001 ‘**’ 0。01 ‘*’ 0。05 ‘。’ 0。1 ‘ ’ 1Residual standard error: 5。774 on 3 degrees of freedomMultiple R-squared: 0。9, Adjusted R-squared: 0。8667 F-statistic: 27 on 1 and 3 DF, p-value: 0。01385

可以看到summary()函式給出了很多統計量,包括殘差、截距、顯著性等等。

(b)table函式

這個函式看起來不起眼,但很實用,給出一個頻率分佈表,還是舉例說明。

> a <- c(rep(NA, 3), rep(1:3, 2))> a[1] NA NA NA 1 2 3 1 2 3> table(a)a1 2 3 2 2 2

上面給出了向量a的頻率分佈,但沒有包含NA,如果要統計NA的數目,則需要新增引數exclude = NULL。

> table(a, exclude = NULL)a 1 2 3 2 2 2 3

需要注意的是生成的頻率分佈也是一張表,如果需要對這個表進行操作,最好轉化成資料框。

> x <- table(a, exclude = NULL)> class(x)[1] “table”> x <- as。data。frame(x) #將x轉換成資料框> class(x)[1] “data。frame”

(c)apply/sapply/tapply/mapply

這是一個函式家族,其實就是為了代替for迴圈,簡化程式碼,這裡只介紹apply和tapply。

apply(x, margin, fun, 。。。)有3個主要的引數,x通常為資料框,margin引數為1或2, 1表示按行,2表示按列,fun為呼叫函式。比如按列統計mtcars資料集的平均數。

> apply(mtcars, 2, mean) mpg cyl disp hp drat wt qsec 20。090625 6。187500 230。721875 146。687500 3。596563 3。217250 17。848750 vs am gear carb 0。437500 0。406250 3。687500 2。812500

tapply(x, index, fun, 。。。)透過index對資料集x進行分組運算,相當於上一期dplyr包中的group_by操作。如我們需要統計iris資料集中不同品種鳶尾花的平均花萼長度。

> head(iris) Sepal。Length Sepal。Width Petal。Length Petal。Width Species1 5。1 3。5 1。4 0。2 setosa2 4。9 3。0 1。4 0。2 setosa3 4。7 3。2 1。3 0。2 setosa4 4。6 3。1 1。5 0。2 setosa5 5。0 3。6 1。4 0。2 setosa6 5。4 3。9 1。7 0。4 setosa

> tapply(iris$Sepal。Length, iris$Species, mean) setosa versicolor virginica 5。006 5。936 6。588

如果用dplyr則是:

> iris %>% group_by(Species) %>% summarise(mean = mean(Sepal。Length))

3 自編函式

R中雖然有很多內建函式,但具體分析時有時候需要使用者自己編寫函式。自編函式中有兩個非常重要的思想,迴圈和遞迴。關於迴圈相信接觸R的人都十分了解,這裡只列舉兩個遞迴函式的例子。

(1)斐波那契數列

斐波那契數列本身就是用遞迴定義的F(n) = F(n-1) + F(n-2),因此非常適合用遞迴函式實現。

> fib <- function(n){ #定義函式 if(n==1 | n==2){ return(1) } else{ return(fib(n-1)+fib(n-2)) } }> fib(7) #函式呼叫 [1] 13

(2)求最大公約數

gcd <- function(a,b) { if (b == 0) return(a) else return(gcd(b, a %% b)) }> gcd(15, 12)[1] 3

可見,遞迴是一種比較高階的程式設計思想,靈活運用能夠極大的化繁為簡。

結語:

以上就是小編認為R中比較實用的一些內建函式,能力有限總結的肯定不夠完全,歡迎大家和小編一起交流R語言學習心得。