溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

發(fā)布時間:2021-10-11 17:53:26 來源:億速云 閱讀:442 作者:柒染 欄目:大數(shù)據

本篇文章為大家展示了如何用R語言和Python實現(xiàn)因子變量與分類重編碼,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

今天介紹數(shù)據類型中因子變量的運用在R語言和Python中的實現(xiàn)。

因子變量是數(shù)據結構中用于描述分類事物的一類重要變量。其在現(xiàn)實生活中對應著大量具有實際意義的分類事物。

比如年齡段、性別、職位、愛好,星座等。

之所以給其單獨列出一個篇幅進行講解,除了其在數(shù)據結構中的特殊地位之外,在數(shù)據可視化和數(shù)據分析與建模過程中,因子變量往往也承擔中描述某一事物重要維度特征的作用,其意義非同尋常,無論是在數(shù)據處理過程中還是后期的分析與建模,都不容忽視。

通常意義上,按照其所描述的維度實際意義,因子變量一般又可細分為無序因子(類別之間沒有特定順序,水平相等)和有序因子(類別中間存在某種約定俗成的順序,如年齡段、職稱、學歷、體重等)。

在統(tǒng)計學中對變量進行了如下四類劃分:定類變量、定序變量、定距變量、定比變量。而其中的定類和定比變量就對應著我們今天將要講解的因子變量(無序因子和有序因子變量)。

因子變量從信息含量上來看,其要比單純的定性變量(文本變量)所包含的描述信息多一些,但是又比數(shù)值型變量(定距變量和定比變量)所表述的信息含量少一些。

因而原則上來講,數(shù)值型變量可以轉換為因子變量,因子變量可以轉換為文本型變量,但是以上順序卻是不可逆的(信息含量多的變量可以放棄信息量,轉換為信息含量較少的變量類型,但是信息含量較少的變量卻無法增加信息含量)。


在R語言中,通常使用factor直接生成因子變量,我們僅需一個向量(原則上可以是文本型、也可以是數(shù)字型,但是通常從實際意義上來說,被轉換的應該是一個含有多類別的類別型文本變量)。

factor(x, levels,labels=levels,ordered=)

以上參數(shù)中,x即是我們將要轉換的變量,levels是將要設定的因子水平(可選參數(shù),省略則自動以向量中的不重復對象為因子水平),labels作為因子標簽(可選參數(shù),與前述因子水平對應,若設置,則打印時顯示的是對應因子標簽,省略則同因子水平一樣,使用向量中不重復值【即類別】作為標簽),ordered是邏輯參數(shù),設定是否對因子水平排序。

vector<-rep(LETTERS[1:5],6);print(vector);plyr::count(vector)

myfactor<-(factor(vector,levels=c("E","D","C","B","A"),labels=c("EEE","DDD","CCC","BBB","AAA"),ordered=TRUE)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

通常來說,factor函數(shù)中,levels一般不用設置,函數(shù)會自動判斷向量內有幾個水平,但是倘若要生成有序因子的話,默認會根據字母順序排列,如果自然順序與目標有序因子順序不一致,則一定要指定levels,labels則視具體需求而定,如果本身就是文本類別的話,一般無需設定標簽。

如果是問卷類數(shù)據,而且編碼為數(shù)值,則一定要通過labels標簽的設定來還原每一個編碼的真實意義。

factor(vector,labels=c("AAA","BBB","CCC","DDD","EEE"),ordered=TRUE)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

因子變量與文本變量數(shù)值變量之間的互轉則通過as.character()或者as.numeric()函數(shù)來實現(xiàn)。

library(dplyr)

as.character(as.factor(1:10))%>%str()

as.numeric(as.factor(1:10))%>%str()

R語言中的因子變量重編碼

如果你有一個度量指標,需要將其轉換為分段的因子變量,則可以通過cut函數(shù)來實現(xiàn)這種轉換。

scale<-runif(100,0,100)

cut(x,breaks,labels=NULL,include.lowest=FALSE,right=TRUE,ordered=)

cut函數(shù)參數(shù)如上,接受一個數(shù)值型向量,breaks接受一個數(shù)值向量(標識分割點)或者單個數(shù)值(分割 數(shù)目)。

right是邏輯參數(shù),設定分割帶是左開右閉或者左閉右開。(默認左開右閉)。

include.lowest則根據right的設定,決定是否應該包含端點值(如果right為TRUE,左開右閉區(qū)間,則包含最小值,如果right為FALSE,左閉右開區(qū)間則包含最大值),默認為FALSE。

ordered則設定是否對因子水平進行排序。

(factor1<-cut(scale,breaks=c(0,20,40,60,80,100),labels=c("0~20","20~40","40~60","60~80","80~100"),include.lowest=TRUE,ordered=TRUE))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

另一種分割場景是使用分位數(shù)函數(shù)進行分割,

qa <- quantile(scale, c(0,0.2,0.4,0.6,0.8,1.0))

(cut(scale,breaks=qa,labels=c("0%~20%","20%~40%","40%~60%","60%~80%","80%~100%"),include.lowest=TRUE,ordered=TRUE))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

以上分割方法在是較為常用的因子變量轉換方法,當然你可以使用if函數(shù)進行類似分割,但是相比較來講,使用cut函數(shù)進行分割要高效很多。

Python


在Python中,Pandas庫包含了處理因子變量的一整套完整語法函數(shù)。

import pandas as pd

import numpy as np

import string

在pandas中的官方在線文檔中,給出了pandas因子變量的詳細論述,并在適當位置與R語言進行了對比描述。

http://pandas.pydata.org/pandas-docs/stable/categorical.html#working-with-categories

當利用pandas生成序列時,可以在序列函數(shù)內的dtype參數(shù)設定因子變量類型。

s = pd.Series(["A","B","C","D","E"], dtype="category")

生成數(shù)據框時,也可以直接生成因子變量。

df = pd.DataFrame({"A":["a","b","c","a"]})

df["B"] = df["A"].astype('category')

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

除了直接在生成序列或者數(shù)據框時生成因子變量之外,也可以通過一個特殊的函數(shù)pd.Categorical來完成在序列和數(shù)據框中創(chuàng)建因子變量。

s = pd.Series(pd.Categorical(["a","b","c","a"], categories=["a","b","c"],ordered=False))

df = pd.DataFrame({"A":["a","b","c","a"]})

df["B"] =pd.Series(pd.Categorical(["a","b","c","a"], categories=["a","b","c"],ordered=False))

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

因子順序的添加可以通過設定序列或者數(shù)框框列的.astype來進行詳細的操作。

s = pd.Series(["a","b","c","a"])

s_cat = s.astype("category", categories=["a","b","c"], ordered=True)

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

無論是序列中還是數(shù)據框中的因子變量生成之后,都可以通過以下屬性查看其具體的類型、因子類別、以及是否含有順序。

s_cat.dtypes

s_cat.cat.categories

s_cat.cat.ordered

一種比較迂回的方法是,先生成普通序列,然后通過設定序列類型完成因子變量的轉化。而想要舍棄因子變量,還原成普通的文本序列,則同樣只需再其astype中進行格式設定。

s = pd.Series(["a","b","c","a"])

s2 = s.astype('category',categories=["a","b","c"],ordered=True)

s2.astype(str)

最后講一下,如何在數(shù)據框中分割數(shù)值型變量為因子變量,pandas的數(shù)據框也有與R語言同名的函數(shù)——cut。

df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})

labels = [ "{0} - {1}".format(i, i + 9) for i in range(0,100,10) ]

df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)

pd.cut(x, bins, right=, labels=,include_lowest=False)  

#df.value代表待風格的變量,第二項是bins可以是一個列表(作為分割點),也可以是一個整數(shù)(作為分割帶箱數(shù)),right控制帶寬是左開右閉還是左閉右開,labels設定輸出顯示標簽,include_lowest=控制是否包含邊界點(以上參數(shù)可以類比R語言中的cut函數(shù))。

如何用R語言和Python實現(xiàn)因子變量與分類重編碼

最后做一個小總結:

關于因子變量在R語言和Python中涉及到的操作函數(shù);

R語言:

創(chuàng)建因子變量:

factor

轉換因子變量:

as.factor

as.numeric(as.character)

分割因子變量:

cut函數(shù)

Python:

創(chuàng)建因子變量:

pd.Categorical(categories=,ordered=)

pd.Series(dtype="category")

轉換因子變量:

df.astype('category',categories,ordered)

分割因子變量:

df.cut(df.value,breaks=,right=,labels)

上述內容就是如何用R語言和Python實現(xiàn)因子變量與分類重編碼,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI