其餘各類型變數
除了最常用到的數值變數與邏輯變數之外,R 還有三種主要的變數類型,分別為字元(character
)、因子(factor
)以及原始(raw
)類型,以下介紹這幾種類型的變數使用方式。
字元向量
字元向量跟一般數值向量一樣可以使用 c
函數來建立:
c("Hello", "World")
使用 class
來檢查字元向量:
class(c("Hello", "World"))
[1] "character"
因子向量
一般的程式語言在處理類別型的資料時,都會以整數來表示,例如男性與女性的資料可能就會以 1
與 2
來代表,但這樣的表示方法會讓人很難閱讀,另外有一種比較好一點做做法是直接使用文字來表示,例如男性以 male
表示,而女性則使用 female
表示,然而這樣還是有其缺點,畢竟類別型的資料跟一般的文字還是有不同的地方。
R 本身對於類別型的資料有獨特的處理方式,它將整數與文字的概念結合,建立一種專門表示類別資料的因子(factor)資料型態:
gender <- factor(c("male", "female", "male")) gender
[1] male female male Levels: female male
因子變數的內容看起來跟字元變數很類似,我們可以直接看得到每個值的名稱,我們可以使用 levels
來列出因子變數中所有的類別:
levels(gender)
[1] "female" "male"
而 nlevels
則是可以計算因子變數類別的總數:
nlevels(gender)
[1] 2
female
會是第一個,而 male
則是第二個。因子變數的名稱背後其實對應的是一些整數資料(R 內部在儲存這些資料時,都是使用整數),我們可以使用 as.integer
來看其對應的數值:
as.integer(gender)
[1] 2 1 2
相較於一般文字資料,以整數的形式儲存類別資料會比較節省記憶體空間,尤其是在類別數量少而資料量大的時候特別明顯,以下我們做一個測試,首先以一般的字元變數來產生 5000 個男生與女生的取樣資料,再將這個資料轉換為因子變數。
gender.char <- sample(c("female", "male"), 5000, replace = TRUE) gender.factor <- as.factor(gender.char)
這裡的 as.factor
會將 gender.char
這個字元的向量轉換為因子向量。接下來我們使用 object.size
來比較看看兩者之間的大小差異:
object.size(gender.char)
40136 bytes
object.size(gender.factor)
20512 bytes
object.size
函數會傳回變數所使用的記憶體大小,將字元變數轉換為因子變數之後,可以節省不少記憶體空間。
如果要將因子變數轉換回字元變數,可以使用 as.character
函數:
as.character(gender)
[1] "male" "female" "male"
Raw 向量
raw 向量是專門用來儲存二進位資料的向量,我們可以將 0 到 255 之間的整數使用 as.raw
轉換為 raw 向量,而這種 raw 向量在輸出時,會以十六進位的方式輸出:
as.raw(0:16)
[1] 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
as.raw
將資料轉換為 raw 向量時,只接受 0 到 255 之間的整數,所有的小數或是虛數都會被捨去,如果遇到不在這個區間的數值,會被直接轉換為 00
:
as.raw(c(pi, 4 + 3i, -23, 300))
[1] 03 04 00 00
如果發生了上述幾種轉換的狀況,R 也會送出警告訊息:
Warning messages: 1: 強制變更時丟棄了虛數部分 2: 在強制變更成純量值時,任何溢位值當作 0 來處理
如果是字元變數要轉換為 raw 向量的話,可以使用 charToRaw
函數:
charToRaw("gtwang")
[1] 67 74 77 61 6e 67
除了以上介紹的幾種變數類型之外,R 還有很多其他類型的變數,其餘的部分會在後續的教學內容中慢慢介紹。
derek
你好,想问一下,因子变量那部分,sample计划是10000个,为什么下面写5000呢,很困惑,多谢
G. T. Wang
抱歉,這是我筆誤寫錯了,目前文章已經更正,謝謝您。
derek
太客气啦,还要感谢您的blog
Annie
你好, 我想請問
就是我再開view的時候中文的部分都會是亂碼
但使用fix的時候則不會,我是使用mac
請問這問題有解決辦法嗎?
路人
femail
有錯字
G. T. Wang
已修正,感謝告知。