標籤:

如何理解R中因子(factor)的概念?

剛開始學R,對因子的概念弄不清楚。怎樣辨別一個變數是因子還是類別型變數?另外,怎樣理解stringsAsFactors=FALSE這個參數,什麼情況該加什麼情況不該加?謝謝大神!


我們先從因子的起源說起。

我們生活中經常會遇到分類的問題,比如從性別上分能分成兩類:男人和女人。如果從年齡上劃分,又可將人群分為青年人(&<-30歲),中年人(30-60歲),老年人(&>60歲)。我們可以將這一表示類別的數據稱為分類數據

分類數據有著重要的意義,比如我們可以對現在流行的共享單車用戶按下面的類別進行分組研究。

對數據進行分組研究後,我們會發現90%用戶在目的地與地鐵/公交站相距3000米內時選擇使用共享單車,共享單車成為最有效的「最後一公里」解決方案。

類別數據對於分組數據研究非常有用。那麼,在數據分析中是如何來表示類別數據呢?

這個問題也源自大數據社群的內部討論。今天我們以數據分析R語言為例,看下在R中是如何表示類別數據的。

1. 如何表示分類數據?

在R中數據的分類是用因子數據類型(factor)來表示的。那麼什麼是因子呢?

因子被用來表示類別數據,因此也被稱為「類別變數」。舉個具體的例子吧,你所在工作單位老闆特別變態,要求每天上班打卡(我個人是非常痛恨上班打卡這種變態的行為的)。

你的老闆電腦里就有所有員工每天打卡的記錄數據,其中有姓名(name),性別(sex),是否打卡(card)等列。

這裡的性別(男,女)有2個類別,就可以把姓名這一列作為因子變數來處理。而姓名這一列因為不是類別,畢竟每個人的姓名是不一樣的,即使有兩個人的姓名重名(加入都叫猴子),這兩個人也不屬於同一類。

不過也確實,這個世界說白了就是男人與女人的世界。

現在你明白了,因子就是用於表示一組數據中的類別,可以記錄這組數據中的類別名稱及類別數目。

在R中使用factor函數來創建因子,下面我們創建了性別向量為因子。

2. 使用分類數據的意義是什麼?

  • 實現研究對象的分組、分類計算

很多時候,一些模型參數都需要傳入變數類型為因子。同時,繪圖時候因子可以幫助你自動實現分組繪圖。下面我們具體看下。

根據一開始的例子,我們創建了一個打卡記錄數據。

你會發現,只要是列里的值是字元串的,R都會自動將該列轉換為因子類型。例如上面的姓名(name)列轉換為因子類型,姓名叫「猴子」的有2個人。同樣的,性別(sex)列也列出了每個類別的數據條數。

但是,姓名不是類別,我們不希望這一列是因子類型,需要將姓名這一列轉換為字元串類型。

繪圖後,我們看到每個性別的人數個數。現在你能理解了因子的作用了吧。正是因為性別(sex)這一列是因子類型,我們才能繪圖是自動按照類別進行分組,計算出每一個類別的數目。

  • 類別數據能幫助我們自動發現錯誤數據

上面我們繪製的柱狀圖,你會發現性別里有個類別(feamle)並不是我們想要的,這有可能是原始數據本身的錯誤。

這時候,我們需要查找原始數據的值進行校驗修改。校驗後我們發現值為「feamle」的數據對應的值應該為性別「男」。我們現在來修改下。

刪除廢棄的類別後,你會發現性別(sex)這一列只有兩個類別了。

3. 類別如何排序呢?

因子的類別默認排序都是按字母順序來排序。但是有時候我們想制定類別的順序。

例如學校讓學生給老師教學打評分的類別有:良好,同意,不滿意,非常同意,非常不滿意。其實,按照正常的順序你希望是這樣的:非常不滿意,不滿意,良好,同意,非常同意

下面我們以性別為例,將這一列的類別按照:女,男順序來排序。

4. 因子的幾個問題

1)數值類型轉換成因子

直接用as.numeric轉換會有問題,轉換後的內容不是你想要的:

2)因子中 levels和lables的區別

levels代表原始類別名稱,lables相當於對類別名稱進行重命名。

下面我們將原始數據中所以類別為女的重命名為「female」,男的重命名為「male」。

上面只是列舉了數據分析R語言中的分類問題處理。其實其他編程語言Python也類似。一個領域中的陌生知識如果搞不明白,我們就可以聯想下這個知識可以和現實生活中的哪些常識對應起來,因為知識的發明根本上是為了解決生活中的問題的。

這個世界也正是有了男人和女人才變的那麼有趣。

漫畫來自Brightside


統計學裡面定類變數,定序變數,定距變數和定比變數,這是是層層遞進的關係,關於這個有大神講的比我好多了。

這裡樓主糾結的在於前兩個,定類變數和定序變數,我的理解是factor可以將定類變數變成定序的,這樣就可以適用於定序的統計方法。

stringAsFactor 建議一直等於false,關於這點Hadley也有說明 分別在開發 dplyr/tibble 和readr包時有說明 ,不信你仔細去閱讀這些包的vignettes。另外readr包默認讀入文本類型數據不自動轉factor,數據讀入還是建議使用這個包~


我覺的,R中的因子就是用來表示分類變數的。比如說性別就是分類變數。分類變數中又分為有序和無序,都可以通過R定義。還有關於讀取的字元串是否作為因子,這個就要看你的這列字元串是不是分類變數了。


想請問下R型因子分析與Q型因子分析的命名來源是?R和Q是否有什麼代表意義呢?


推薦閱讀:

R語言分層抽樣的函數是什麼?
r語言中句號(點號)「.」的含義是什麼?
R中的列表(list)和數據框(data.frame)有什麼區別?
用R可以做數據清洗嗎?或者有更好的數據清洗工具?

TAG:R編程語言 |