R語言自學日記(1) - 常用資料型態

Edward Tung
R 語言自學系列
7 min readJul 6, 2018

前言

因為工作需要,我打算在兩個月裡頭把R語言給補充起來,好在作為直譯式語言(Interpreted Language),加上先前在Python上機器學習的經驗,整體轉換起來並不困難。這個系列會是關於R語言上實作時間序列分析,主要是ARMA與GARCH的實作練習,我也打算將一些深度學習常用的框架諸如RNN放在實作中,不過深度的數學研討就不要找我了,我也還在研究(笑)。

R語言簡介與執行環境

R語言的下載可以直接在官方網站搜尋到,網址如下:

https://cran.r-project.org/

至於開發環境,我選用熱門的RStudio,這個IDE在常用的功能上整合得十分不錯,我認為對於初學者來說非常好上手,包括Variable Explorer、繪圖區等等都非常一目了然,介面也十分簡潔乾淨,以下是我用道瓊指數簡單寫的一些程式碼,為了展示,特地把迴圈執行寫了出來:

從上面的圖片可以看到,不管是讀入檔案,或是迴圈編寫、繪圖都非常的簡潔(個人認為有些統計方法的撰寫甚至比Python更簡單一些),與Python有非常多相似之處,舉例來說for迴圈跟if判斷式的編寫:

當然撇開Python必須習慣從0開始計數,以及兩者表達符號有少許不同,整體的表達邏輯與撰寫方式等等都是非常相像的,以下附上IDE下載連結:

https://www.rstudio.com/

變數指定與資料型別

在R語言中比較不一樣的是,可以用"<-"以及"="兩種方法來指定變數,大部分情況下兩者是可以互通的,惟注意的是"<-"才是實際上的賦值,舉例來說,func(x<-10)與func(x=10)就有差別,前者是指定x變數為10,因此在函式結束後這個值仍然被保留下來,而後者則僅作為函數運算使用。

針對變數的轉換,Python中比較熟悉的是使用如str()、float()等方式來轉換(當然各種套件包也支援比方astype等方式,但這裡就不一一列舉),R語言使用as.numeric()的方式將資料轉換成我們要的格式,如下:

說到這裡則必須提一下R語言中常見的資料型別(Data Type),包含:字元(character)、numeric(double雙精度浮點數)、integer(整數值)、complex(虛數、logical(TRUE/FALSE判斷值),當然還有如日期、列表、向量等,尤其向量與因子跟Python十分不同,以下一一介紹:

向量(Vector)

向量實際上就是一串數組或字元組,指定方式如下:

向量就如同高中數學所學的是可以支援一些運算的,比如簡單的sum或是mean指定可以計算加總與平均,也可以支援如向量內積等複雜的運算方式,只要用簡單的運算符號像是%*%就可以了:

此外,向量是可以命名的,因此就能夠支援條件判斷:

我將weight_gain向量的五個值分別以weekday命名,並透過lose_weight <- weight_gain < 0 的值,就可以篩選出體重變輕的天數。

矩陣 (Matrix)

矩陣估計是所有程序員認為最強大的資料結構之一,可以做到非常多複雜的計算、高階迭代,在資料科學行業,可以做到維度轉換、線性組合以支援非常多複雜的統計方法和演算法。矩陣的創建十分簡單:

常見的計算就是複雜的方程式數組,一般而言可以寫成這樣的表達式,並在R語言中用簡單的幾行代碼完成:

上面的代碼中可以透過t(mat)簡單的完成矩陣轉置,透過%*%運算符號完成矩陣相乘,比起Python要透過Numpy撰寫np.dot(mat1,mat2)的表達式而言,要顯得簡潔不少。此外,矩陣可以簡單地透過rbind(), cbind()方法分別完成矩陣的擴增,在Python中則需透過Numpy寫成np.hstack()或是np.vstack方法,兩者同樣支援Slice方法,也就是Matrix[row,col]的方式篩選元素。

因子 (Factors)

因子是R獨特的結構方法,可以非常快速地支援索引、類別資料儲存等方式,在資料處理上是非常強大的工具,比如說:

透過Factor,我們可以抽取出一組資料中的所有類別,並透過level針對類別作排序,舉例來說我們認為世界上的運動熱門程度分別是籃球、棒球、羽球,我們就可以指定我們要的level順序,以供後續更多計算使用,以下再舉一個例子,假設我們隨機抽取了美國與英國各12個小鎮最受歡迎的運動,我們想要比較美國第X個小鎮比起英國第X小鎮,有沒有比較跟世界趨勢符合:

顯然程式告訴我們並沒有,兩個國家的該小鎮都是籃球最受歡迎。這個例子聽起來有點奇怪,但倘若我們能夠在統計上抽樣消弭掉人數誤差、城鄉誤差等等可能造成資料偏誤的因素的話,透過多重比較,我們可以了解世界上不同國家與整體趨勢的變化程度,而這都得力於level能幫助我們快速篩選類別標籤並做出比較。

列表 (List)

與Python非常類似,我們可以用相同的語法命名一個列表,就是list(),列表接支援索引,因此我們可以用list[:-10]等方式輕易刪除列表最末端十個值。R中支援一個非常有意思的切片方法,這邊我與下面的DataFrame一起說明。

資料框 (Dataframe)

我們可以比較一下R與Python的DataFrame寫法,DataFrame基本上是創建一個類似Excel工作表的資料形式,包含欄與列,允許使用者透過rows與columns的操作給資料框命名、切片、分段預算、分群運算等,另一個重點是,資料框對於資料前處理的檢視非常有用。

一個我個人認為非常簡潔明瞭的表達式是"$",准許使用者根據名字直接做索引,舉例而言我想要抓取第一個columns做運算,R語言只需要透過data$X1這樣子就可以了,而Python則必須data.iloc[:,0],或是data.iloc[:,[“X1”]]來處理,這使得R語言的處理程序變得非常簡潔。

總結

整體而言,R語言的資料型態還是非常好熟悉的,下一篇將談談常用的套件內容以及這些套件能夠做的事,如果你喜歡我的文章,還請不吝幫忙點個拍手,或是有甚麼建議都歡迎告訴我!最後還是期勉自己能夠成功學起來啦哈哈哈。

--

--

Edward Tung
R 語言自學系列

Columbia Student || 2 yrs of data scientist and 1 yr of business consultant experience