R 變數與工作空間

其餘各類型變數

除了最常用到的數值變數與邏輯變數之外,R 還有三種主要的變數類型,分別為字元(character)、因子(factor)以及原始(raw)類型,以下介紹這幾種類型的變數使用方式。

字元向量

字元向量跟一般數值向量一樣可以使用 c 函數來建立:

c("Hello", "World")

使用 class 來檢查字元向量:

class(c("Hello", "World"))
[1] "character"
R 是屬於比較高階的語言,在 R 中的字元變數不會像其他低階的程式語言一樣有區分單一字元與字串,也不需要像 C 語言一樣考慮字串結尾的 null 字元問題,使用者只需要直接很直覺的使用它即可。

因子向量

一般的程式語言在處理類別型的資料時,都會以整數來表示,例如男性與女性的資料可能就會以 12 來代表,但這樣的表示方法會讓人很難閱讀,另外有一種比較好一點做做法是直接使用文字來表示,例如男性以 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 還有很多其他類型的變數,其餘的部分會在後續的教學內容中慢慢介紹。

R
  1. derek

    你好,想问一下,因子变量那部分,sample计划是10000个,为什么下面写5000呢,很困惑,多谢

    • G. T. Wang

      抱歉,這是我筆誤寫錯了,目前文章已經更正,謝謝您。

  2. Annie

    你好, 我想請問
    就是我再開view的時候中文的部分都會是亂碼
    但使用fix的時候則不會,我是使用mac
    請問這問題有解決辦法嗎?

  3. 路人

    femail
    有錯字

Leave a Reply