---
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]