HOWTO · R
在 R 中將因子轉換為數值
瞭解如何安全地將 R 因子轉換為數值標籤、區分因子代碼與實際值,並處理無效標籤。
本頁內容
當因子 f 包含數值標籤,而你需要將這些標籤作為數值使用時,請使用 as.numeric(as.character(f))。直接呼叫 as.numeric(f) 傳回的是因子的內部整數代碼。只有在有意將這些代碼作為類別 ID 使用時,直接轉換才合適。
瞭解 as.numeric 對因子的傳回值
R 因子包含整數代碼和一組獨立的字元型水平。代碼按照排序後的順序或明確指定的順序指向各個水平;它們不一定是原始測量值。你可以使用 levels() 和 unclass() 檢查這兩部分。
as.numeric(f) 的輸出是類似 2 1 2 3 的代碼序列。這並不表示原始值是 2、1、2 和 3。當資料框將看似數值的欄位匯入為因子時,這項差異非常重要。
將看似數值的因子標籤轉換為數值
先將因子轉換為字元,再將標籤轉換為數值:
f <- factor(c("3", "2", "3", "4"))
values <- as.numeric(as.character(f))
values
如果已知因子的水平都是數值,as.numeric(levels(f))[f] 是一種高效的替代方法。兩種方法還原的都是標籤,而不是內部代碼。先轉換為字元通常較易閱讀,並且清楚呈現兩次轉換。
小數和負數形式的數值標籤也採用相同的處理方式。應在匯入或資料清理步驟附近執行轉換,並在將結果用於計算前使用 str() 或 class() 進行檢查。
有意地為類別標籤編碼
如果標籤表示類別,就不要將其代碼視為測量值。需要穩定的 ID 時,請明確設定類別順序:
grade <- factor(c("low", "high", "low"), levels = c("low", "high"))
codes <- as.numeric(grade)
codes
這裡的 1 和 2 是類別代碼,因為順序是明確指定的。它們並不表示 high 是 low 的兩倍。對於業務或模型特定的對應關係,具名查詢向量會更清楚:
grade <- c("low", "high", "low")
score <- c(low = 10, high = 20)[grade]
score
這樣可讓每個數值的意義保持清楚,同時避免依賴預設的因子水平順序。
處理非數值標籤、缺失值和警告
即使先轉換為字元,也無法將任意標籤轉換為數值。非數值文字會變成 NA,R 會發出強制轉換警告;原本缺失的值仍然保持缺失:
f <- factor(c("12.5", "oops", NA))
values <- as.numeric(as.character(f))
values
is.na(values)
應將意外出現的 NA 視為資料品質問題的訊號。檢查原始標籤,必要時移除或正規化空白,並在分析前決定如何處理無效記錄。不要在未說明的情況下將它們替換為零。如果標籤表示類別而不是數值,請使用明確的對應關係或明確設定順序的因子。
驗證轉換結果
在依賴結果之前,請檢查來源資料的類別、因子水平、轉換後的值以及任何警告。簡要規則如下:
- 對有意使用的因子代碼使用
as.numeric(f); - 對數值標籤使用
as.numeric(as.character(f)); - 對類別使用明確順序或具名對應關係;以及
- 轉換匯入的文字後檢查
NA值。
現代 R 程式碼應明確指定匯入類型或因子水平,而不是依賴過去關於字串是否自動轉換為因子的預設行為。透過這些檢查,可以清楚瞭解每個數值結果的預期意義。