為相當基本的問題道歉,但我無法輕松找到任何答案,也只是想對事情進行一些可靠的確認。
我有一個包含數字、因子和有序因子變數的資料框,當我使用 as.matrix 將其轉換為矩陣時,我注意到矩陣的元素都是字符。根據這次經驗,我有兩個問題;
首先,我是否正確地說向量和矩陣只能包含一種資料型別,這就是強制發生的原因?
其次,更重要的是,資料框中的哪些資料型別組合導致字符矩陣與數字矩陣等?例如,如果我的 df 中只有邏輯、整數和數字型別,我想我會得到一個數字矩陣,這是正確的嗎?那么,當轉換為矩陣時,是否只是在我的資料框中包含因子、有序因子和/或字符,從而將每個元素強制轉換為字符?
非常感謝閱讀,任何幫助表示贊賞:]
uj5u.com熱心網友回復:
回答你的第一個問題:是和不是。
實際上,矩陣是具有dim屬性的向量。
并且向量通常必須只有一種資料型別。Alist是一個例外:它是一個vectorwithlist模式,一個串列也可能有一個dim屬性。
例如:
> is.vector(list(1, "a", T))
[1] TRUE
> mode(list(1, "a", T))
[1] "list"
> a <- structure(list(1, "a", T, 1 2i), dim = c(2, 2))
> is.matrix(a)
[1] TRUE
> a
[,1] [,2]
[1,] 1 TRUE
[2,] "a" 1 2i
但這仍然可能as.matrix是強制執行的原因:將所有內容轉換為單一型別并處理具有單一型別元素的矩陣要容易得多。
但是,這是由 做出的選擇as.matrix,盡管我認為不可取,但可以將 data.frame 轉換為 list-matrix,同時保持所有資料型別不變。
這將是低效的:向量可以存盤在連續的記憶體位置,這意味著 1/ 在存盤元素資料型別時不會浪費記憶體,并且 2/ 使用向量化代碼進行更快的處理 3/ 外部 C 或 Fortran 代碼需要連續的資料型別,它會處理串列既麻煩又無用。我從未見過實際使用過的串列矩陣,盡管我想它在某些情況下可能會有所幫助。
您的第二個問題的答案在以下檔案中as.matrix:
as.matrix 是一個通用函式。如果只有原子列和任何非(數字/邏輯/復雜)列,則資料幀的方法將回傳字符矩陣,將 as.vector 應用于因子并將格式應用于其他非字符列。否則,將使用通常的強制層次結構(邏輯<整數<雙<復數),例如,所有邏輯資料幀將被強制轉換為邏輯矩陣,混合邏輯整數將給出整數矩陣等。
你也可以看看源代碼as.matrix.data.frame。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445314.html
