--- disqus: ahb0222 GA : G-CQ4L16KHK4 --- R 語言_基本計算 === > [color=#40f1ef][name=LHB阿好伯, Jan 30, 2019 06:48 PM][:earth_africa:](https://www.facebook.com/LHB0222/) ###### tags: `R` [TOC] 四則運算 - 跟我們平時所用的加(+)、減(-)、乘(*)和除(/)一樣 大家可以參考下列範例 ```R= x <- 2 + 4 y <- x - 6 z <- (y + 4 ) * x z / x ``` ![四則運算](https://i.imgur.com/D6thytE.png) 餘數和商數 --- 計算餘數所使用的符號是"%%",可計算出除法運算中的餘數。 整除所使用的符號是"%/%",是指除法運算中只保留整數部分 ``` R=+ #計算9除以6的餘數 9 %% 6 #計算12除3的商數 12 %/% 3 ``` 次方或平方根 --- 次方的符號是"**"或"^",平方根是使用函數sqrt()。 平方根的計算也可以0.5次方替代 ``` R=+ #計算2的平方 2 ** 2 #計算2的3次方 2 ^ 3 ``` ![R的次方或平方根](https://i.imgur.com/dJ8N95A.png) 絕對值 --- 絕對值的函數名稱是abs(),不論函數內的值是正或負,結果皆顯示正數。 ![R的絕對值](https://i.imgur.com/GztDsPv.png) ### 判斷正負值-sign() :::danger sign(x) ::: 正數回傳 1 負數回傳 -1 0 回傳 0 ## R的指數與對數 exp(x)是指自然數e的x次方,其中e的近似值是2.718282。 對數有2種類型。 1.以自然數e為底的對數,,語法是log(x) 2.以一般數y的對數,語法是log( x,y ) ![指數與對數](https://i.imgur.com/u4ystNN.png) R的科學符號 e --- 與我們常看到的顯示方法很像,在這須注意數字與e不可空格,不然會發生Error錯誤 ![科學符號](https://i.imgur.com/d0UeAha.png) pi 為系統預設值,但也是可以將其取代乘其他數字 ![](https://i.imgur.com/LwTc11q.png) 假設不小心更改到,只需要利用函數 rm()去除變數即可 ![](https://i.imgur.com/hvVpKoz.png) 三角函數 --- ![](https://i.imgur.com/7rODMIf.png) R語言支援三角函數,有許多例如,sin(), cos() , tan() , asin() , acos() , atan() , sinh() , cosh() , tanh() , asinh() , acos() , atan() 四捨五入 --- ![](https://i.imgur.com/rWzTLVM.png) 四捨五入範例,第二項也可以填入負值設定為百位數 ![](https://i.imgur.com/5bqoI6e.png) 近似函數 --- R 語言中有3個求取近似值得函數 ```R= floor(x) #可得到小於等於 x 的最近整數, floor(12.3) 得到 12, floor(-12.3) 得到 -13 ceiling(x) #可得到大於等於 x 的最近整數, ceiling(12.3) 得到 13, ceiling(-12.3) 得到 -12 trunc(x) #可直接取得整數trunc(12.3)得到 12, trunc(-12.3) 得到 -12 ``` 階乘 n! --- 在數學中,正整數的階乘是所有小於及等於該數的正整數的乘積 ![](https://i.imgur.com/nY7Dw3Z.png) factorial(x) 可以返回 x 的階乘 例如factorial(5) = 5 * 4 * 3 * 2 * 1 = 120 無限大 Infinity --- R 語言可以處理無限大的值,使用代號值 Inf 如果是負無限大則是 -Inf 也可以將某一個數字除以 0 就可獲得無限大 若是要查詢某一變數是否為無限大的數值 可以利用 ```is.infinite(x)```來判斷 如果 x 是無限大則傳回邏輯值 TRUE 否則傳回 FALSE ![](https://i.imgur.com/TqUSlCZ.png) Not a Number(NaN) --- 可以解釋為非數字或稱無定義數字 例如無限大除以無限大 ![](https://i.imgur.com/BOb3mi0.png) 若是有NaN值用於計算結果都會是NaN # Not Available (缺失值,NA) 常稱為缺失值或遺漏值(Missing Value) 一樣利用 ```is.na``` 我們就可以判斷是否有缺失的數值 而詳細的處理方式可以參考下面連結 >[R筆記–(10)遺漏值處理(Impute Missing Value)](http://rpubs.com/skydome20/R-Note10-Missing_Value) >[name=skydome20][time=Wed, Jun 06, 2016 11:16 AM] 在進行資料科學相關活動時一定會遇到數據中有缺失值的問題 若是有缺失值對於之後資料整理(或稱資料清洗)上會有困難 如果沒有好的資料對於後續的分析就可能會有很大的偏差 下面我們先以一個簡單數列來測試 ``` R= na.test <- c(1,2,3,NA,5,6,NA) is.na(na.test) ``` ```[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE``` 可以看到回傳一堆 TRUE and FALSE 這時我們可以利用sum()計算遺漏值的個數 ```R= sum(is.na(na.test)) ``` 缺失值處理 --- 在處理遺漏值時簡單可以**直接移除資料**或是用**平均值來填補遺漏值** 但這樣的做法並不推薦:前者會讓資料減少,後者不會產生任何資訊 因此在缺失值處理上推薦==k-Nearest Neighbours==或==mice套件== 來填補遺漏值。其中,mice的全名為Multivariate Imputation via Chained Equations。 兩者的概念相同,都是先==模擬遺漏值==後進行==填補(impute)== --- 我們利用R內建數據集```iris```來進行測試 R內建的鳶尾花(iris)資料集是非常著名的生物資訊資料集之一 取自[美國加州大學歐文分校的機械學習資料庫](http://archive.ics.uci.edu/ml/datasets/Iris) 資料的筆數為150筆,共有五個欄位: 1. 花萼長度(Sepal Length):計算單位是公分 2. 花萼寬度(Sepal Width):計算單位是公分 3. 花瓣長度(Petal Length) :計算單位是公分 4. 花瓣寬度(Petal Width):計算單位是公分 5. 類別(Class):可分為Setosa,Versicolor和Virginica三個品種 ```R= # 安裝missForest套件 install.packages("missForest") require(missForest) # 在iris資料內,隨機產生10%的遺漏值 iris.na.test <- prodNA(iris, noNA = 0.1) #查看前6筆數據 head(iris.na.test) ``` ![](https://i.imgur.com/hlXoSLY.png) 直接移除有缺失值的資料 --- ``` R # 移除有遺漏值的資料 rm.iris.na.test <- iris.na.test[complete.cases(iris.na.test), ] ``` 上面指令是利用complete.cases(iris.na.test)取得每一列數據中是否有缺失值 再利用中括號 `[]` 來指定元素的索引(index)回傳 但這麼做並不太好,因為會造成資訊損失(information loss) 或是也可以使用na.omit()函數去除 使用平均數填補遺漏值 --- ``` R= # 以下用平均數,來填補某一欄位的遺漏值 # 先建立一個初始資料集 mean.iris.na.test <- iris.na.test # 取得第一欄位的平均數,na.rm = T 則是忽略缺失值計算 mean.row1 <- mean(mean.iris.na.test[, 1], na.rm = T) # 用第一欄位的平均數,填補第一欄位的遺漏值 na.rows <- is.na(mean.iris.na.test[, 1]) # 用第一欄位的平均數,填補第一欄位的遺漏值 mean.iris.na.test [na.rows, 1] <- mean.row1 ``` K-Nearest Neighbours填補遺漏值 --- K-Nearest Neighbours(KNN演算法,又譯K-近鄰演算法) 最近鄰居法採用向量空間模型來分類,概念為相同類別的案例 彼此的相似度高,而可以藉由計算與已知類別案例之相似度 來評估未知類別案例可能的分類 下面兩張圖可以很清楚了解KNN的原理 >[擷取至[Machine Learning] kNN分類演算法](http://enginebai.logdown.com/posts/241676/knn) > ![](https://i.imgur.com/Qy1xqYN.png) ![](https://i.imgur.com/8eutbUj.png) ```R # 安裝DMwR套件 install.packages("DMwR") require(DMwR) imputeData <- knnImputation(iris.na.test) head(imputeData) ``` 使用上非常簡單 Multivariate Imputation by Chained Equations (鍊式方程的多元插補,MICE) --- mice即是基於多重填補法構造的 基本思想是對於一個具有缺失值的變量 用其他變量的數據對這個變量進行擬合 再用擬合的預測值對這個變量的缺失值進行填補 在MICE裡面,提供了很多資料探勘的模型(linear regression, logistic regression, cart, random forest, boostrap……),來針對遺漏值進行預測! 概念很簡單:現在我們有欄位V1,V2,V3……Vn,每個欄位裡面都有遺漏值。 當我們要填補V1的遺漏值時,就先把V2,V3……Vn的欄位當作自變數(X) 把V1當作應變數(Y),並且進行建模,然後用預測的結果來填補V1的遺漏值。 同理,針對V2,就用V1,V3……Vn建模,然後用預測的結果來填補V2的遺漏值。 (由於這個函式,背後有使用Gibbs sampling(一種抽樣手法)。 即使使用某個模型進行遺漏值填補,也會因為抽樣手法,造成最後填補的結果有些許不同) ```R= # 安裝 mice 套件 install.packages("mice") require(mice) mice.iris.na.test <- mice(iris.na.test, m = 3, # 產生三個被填補好的資料表 maxit = 50, # max iteration method = "cart", # 使用CART決策樹,進行遺漏值預測 seed = 188) # set.seed(),令抽樣每次都一樣 complete(mice.iris.na.test, 1) # 1st data complete(mice.iris.na.test, 2) # 2nd data complete(mice.iris.na.test, 3) # 3rd data ``` 參考文章 === >[R筆記–(10)遺漏值處理(Impute Missing Value)](http://rpubs.com/skydome20/R-Note10-Missing_Value) >[name=skydome20] >[Missing Value Treatment | 遺失值處理 | 統計 R語言](https://www.jamleecute.com/missing-value-treatment-%E9%81%BA%E5%A4%B1%E5%80%BC%E8%99%95%E7%90%86/) >[name=果醬珍珍 Jam Lee] >[R语言处理缺失数据的高级方法](https://blog.csdn.net/lilanfeng1991/article/details/36467891) >[name=feng_lilan] >[R语言中的缺失值处理] (https://blog.csdn.net/u011596455/article/details/79608969) >[name=HuFeiHu-Blog] >>[Data prep and pattern](https://datascienceplus.com/missing-value-treatment/)[name=Selva Prabhakaran]