R是一個物件導向的程式語言,即R裡所有的東西都是物件。在學習用R處理和分析資料之前,我們要先對資料型態有一定的認識,這樣才知道如何正確的建構和操作我們要分析的資料。
首先介紹R的6個基本資料型態(atomic data types)
資料(data)是資訊(information)的組合,可以用來乘載資訊的表現形式不勝枚舉,像是聲音、影像、溫度、體積、電量等等,而這些訊息又可以細分為由文字和數字組成,除了文字和數字,依照電腦資料分析的需求,R的基本資料型態(atomic data types)還包含邏輯和原始。
下表整理了這六個資料型態是什麼?彼此之間有什麼區別?
6 atomic data types
Data type
|
Example
|
Note
|
character字串
|
"a" "Google"
|
文字字串,需以雙引號(或單引號)括起來
|
numeric實數、浮點數
|
a <- 0.8
|
1. 多數數值的型態
2. 浮點數(floating point)?
在計算機儲存中和整數沒什麼區別,只是在解釋時須在指定位置加上小數點
3. 電腦用雙倍精準度(double)儲存,即64位(8位元組)
|
integer整數
|
b <- 10L
|
加上L告訴電腦以整數儲存,用以區別浮點數
|
complex複數
|
c <- 5+2i
|
包含實數與虛數,少用不討論
|
logical邏輯
|
TRUE FALSE
|
邏輯判斷的結果
|
raw原始
|
charToRaw("ABC") =41 42 43
|
電腦儲存字元的原始碼,採十六進制,少用不討論
|
使用mode, class, typeof函數確認基本資料型態
那麼如何確認R物件的基本資料型態?
mode是用來確認資料型態的「模式」,是資料範疇最大的分類,所有物件只會有一個而且是唯一的mode,atomic modes包含numeric, complex, character, logical,其他recursive的物件有list, function等等。
Note: 在R裡,recursive和atomic是相對的,中文是「迴歸的」,我的理解是它可以自成一個type,所以像vector是atomic,list是recursive。簡單來說,除了6個atomic data types和NULL以外都是recursive。檢驗方式是is.atomic(), is.recursive()。
class是用來確認高階層分類的資料型態,常見的有6個atomic data type和其他recursive的物件。像是matrix, list和data.frame。
typeof則是用來確認低階層分類的資料型態,像是numeric裡面還可以分成double。不過這個我們通常很少使用。
以資料分類範疇大小來看: mode > class > typeof,一般最常使用的是class,函數(function)的處理取決於資料的class。
同樣的,還有另一個方式可以判斷基本資料型態。
使用is.character, is.numeric, is.integer, is.logical判斷基本資料型態
若想要確定資料型態,可以用is.資料型態名稱來進行邏輯判斷,其他recursive的資料型態也適用。
使用as.character, as.numeric, as.integer, as.logical改變基本資料型態
若想要轉換資料型態,可以用as.欲轉換資料型態來執行。
R資料型態的Coercion
我們知道,vector, matrix只能承載同一資料型態的元素物件,但是data frame可以允許不同資料型態的元素物件同時存在,當建立像vector, matrix的資料型態時,若包含兩種以上的資料型態時,R會自動把某些資料型態coerce成某一種,讓資料型態一致。
那麼Coercion的規則是什麼?
logical < numeric < character
For numbers: integer < numeric < complex
也就是當碰到這些資料型態混合在vector中,大魔王是character,大家碰到他都要乖乖變成character,以此類推。當各種數字型態出現時,則是根據最大範疇的數來決定,複數包含所有實數,實數則包含所有整數,誰的範疇最大誰就是老大,還蠻直覺的。
沒有留言:
張貼留言