2018年1月16日 星期二

[Data Science 到底是什麼從一個完全外行角度來看][17]R語言基礎 上篇 - 語言特性和資料形態

image
圖片來源: https://pixabay.com/en/books-spine-colors-pastel-1099067/https://pixabay.com/en/math-blackboard-education-classroom-1547018/

在上一篇([16]用R來看股票,透過quantmod了解R的強大)用了quantmod快速了解如何使用R並且用他來做資料處理的便利性。

在這篇將會更深入一點點的介紹R的語言特色、幾種不同的資料形態。

R的語言特性(Language Paradigm)

基本上現在任何程式語言都會有多個語言特性,例如C#一開始屬於Object Oriented Language,不過後來吸收了一些別的特性,又多出了像是Functional Language的特性等。知道了語言特性之後,對於整個運作模式會比較了解。那R是屬於什麼類型呢?

基本上,個人覺得R有兩個重要的特性:

  1. Vector Base
  2. Functional Programing

Vector Base - 一切都是向量

基本上在R裡面,最基本的組成是vector,因此就算一個簡單的2+3,最後的結果其實是一個vector:

image
可以看到最後的結果是 5,不過他的值是[1] - 換句話說就是vector的第一筆
題外話 - 在R裡面,assign variable用的是 <-。雖然用=也可以,但是因為=在特殊地方有特殊含義,因此還是建議用<-

vector為導向有什麼特別的嗎?vector為主對於做運算非常方便:

單數運算

如果是對單數做加減乘除,會把所有的vector都加上那個值。

b <- c(2,3)
b * 2
image
可以看到,在vector裡面兩個值都被*上2
兩個vector運算

如果是兩個vector相加,那麼對應的位置會互加。

c <- c(6,7)
b+c
image
可以看到,對應位置的會互相加
要做到這種所有內容都要運算,一般語言都要用到loop才有辦法做到。不過vector base基本上就不需要,這也是為什麼雖然R有支援loop但是用到比較少。

Functional Programming

基本上R可以理解為functional programing language。因此如果很熟悉functional programming的開發方式,會覺得很親切。

舉例來說,剛剛那個所有vector都+2的範例,如果改成functional寫法可以是:

sapply(b, function(x){x + 2})

得到的結果會是:[1] 4 5

這邊的意思是,對於每一個bvairable的每一個值,會對他們執行一個anonymous function (匿名函數),這個function就是把值+2

apply類型的function很常見,例如:lapplysapplyvapply等。

基本上每一個用途差不多,差異在於回傳的形態

如果C#有習慣用lambada,會覺得其實很親切,這個其實就是C#從functional language學習到的特色之一。

R還有一些別的特性,不過個人認為上面兩個最重要,並且因為這兩個的關係,所以雖然R支援loop,但是使用比較少(所以也不會特別介紹)。

對於特性有點概念了之後,來看看R裡面的形態和其他資料結構。

R的資料形態(data type)

R和一般語言不一樣,在C#裡面如果有個variable是int,例如:int a,那麼a的形態就是integer。

但是在R裡面,雖然資料形態是integer,但是他的底層是vector,這也是為什麼說R是vector base,因為一切都是vector。 integer只是代表裡面儲存的資料形態而已。

資料形態 範例值 Note
Logical
TRUE,
FALSE,
T,
F
注意要全大寫
Numeric
10.5,
2.5
Integer
1L
2L
注意後面要加上
L
Character
"abc",
'123',
"TRUE"
單引號
'或者雙引號
"都可以
Complex
3 + 2i
Raw
charToRaw("hello")
Factor
factor(c("male", "female"))

  • Factor其實就是c#的enum
  • Factor不算data type,不過歸在這邊比較好看
資料形態 範例
Logical
l <- c(TRUE, FALSE, T, F)
class(l)
is.logical(l)
Numeric
n <- c(10.5, 2.5)
class(n)
is.numeric(n)
                
Integer
i <- c(1L,2L)
class(i)
is.integer(i)
Character
char <- c("abc", '123', 'TRUE')
class(char)
is.character(char)
                
Complex
complex <- c(3 + 2i)
class(complex)
is.complex(complex)
                
Raw
raw <- charToRaw("hello")
class(raw)
is.raw(raw)
                
Factor
gender <- factor(c("male", "female"))
class(gender)
is.factor(gender)
                

要非常注意這些Data Type非常重要,之後在分析資料的時候很有可能因為形態錯誤的關係導致使用的演算法結果錯誤。

因此了解這些基本形態會減少掉之後很多問題。

這篇有用到的R function介紹

在這邊用到了三個R的方法(還有c不過這個下一篇介紹):

class
這個用來看variable裡面的data type是什麼
is.*
用來判斷某個variable的class符不符合。
有個function是as.*,用來做轉型用。
factor()
把vector轉成factor

結語

在這篇首先對R的語言特性先做了介紹,了解到兩個最重要的特性:

  1. Vector base
  2. functional programming

再來看了R裡面的每一個最小單位的不同形態。

在下一篇將會介紹R裡面的資料結構(Data Structure),和如果有問題如何找到相關的文件。


沒有留言 :

張貼留言