R語言因子類型的實現_第1頁
R語言因子類型的實現_第2頁
R語言因子類型的實現_第3頁
R語言因子類型的實現_第4頁
R語言因子類型的實現_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第R語言因子類型的實現目錄1.因子2.table()函數3.tapply()函數4.forcats包的因子函數

1.因子

R中用因子代表數據中分類變量,如性別、省份、職業。有序因子代表有序量度,如打分結果,疾病嚴重程度等。

用factor()函數把字符型向量轉換成因子,如

x-c("男","女","男","男","女")

sex-factor(x)

sex

返回:

attributes(sex)

返回:

因子有class屬性,取值為factor,還有一個levels(水平值)屬性,此屬性可以用levels()函數訪問,如

levels(sex)

返回:

因子的levels屬性可以看成是一個映射,把整數值1,2,...映射成這些水平值,因子在保存時會保存成整數值1,2,...等與水平值對應的編號。這樣可以節省存儲空間,在建模計算的程序中也比較有利于進行數學運算。

事實上,read.csv()函數的默認操作會把輸入文件的字符型列自動轉換成因子,這對于性別、職業、地名這樣的列是合適的,但是對于姓名、日期、詳細地址這樣的列則不合適。所以,在read.csv()調用中經常加選項stringsAsFactors=FALSE選項禁止這樣的自動轉換,還可以用colClasses選項逐個指定每列的類型。

用as.numeric()可以把因子轉換為純粹的整數值,如

as.numeric(sex)

返回:

因為因子實際保存為整數值,所以對因子進行一些字符型操作可能導致錯誤。用as.character()可以把因子轉換成原來的字符型,如

as.character(sex)

返回:

為了對因子執行字符型操作(如取子串),保險的做法是先用as.character()函數強制轉換為字符型。

factor()函數的一般形式為

factor(x,levels=sort(unique(x),na.last=TRUE),

labels,exclude=NA,ordered=FALSE)

可以用選項levels自行指定各水平值,不指定時由x的不同值來求得。可以用選項labels指定各水平的標簽,不指定時用各水平值的對應字符串。可以用exclude選項指定要轉換為缺失值(NA)的元素值集合。如果指定了levels,則當自變量x的某個元素等于第j個水平值時輸出的因子對應元素值取整數j,如果該元素值沒有出現在levels中則輸出的因子對應元素值取NA。ordered取真值時表示因子水平是有次序的(按編碼次序)。

在使用factor()函數定義因子時,如果知道自變量元素的所有可能取值,應盡可能使用levels=參數指定這些不同可能取值,這樣,即使某個取值沒有出現,此變量代表的含義和頻數信息也是完整的。自己指定levels=的另一好處是可以按正確的次序顯示因子的分類統計值。

因為一個因子的levels屬性是該因子獨有的,所以合并兩個因子有可能造成錯誤,但在最新版本4.1.2沒有報錯,應跟版本有關,如

li1-factor(c('男','女'))

li2-factor(c('男','男'))

c(li1,li2)

返回:

如果結果不是因子的話,需要對其進行轉換。則那樣正確的做法是

factor(c(as.character(li1),as.character(li2)))

就是先轉換為字符型,再進行合并就可以了。

2.table()函數

用table()函數統計因子各水平的出現次數(稱為頻數或頻率)。也可以對一般的向量統計每個不同元素的出現次數。如

x-c("男","女","男","男","女")

sex-factor(x)

table(sex)

返回:

對一個變量用table函數計數的結果是一個特殊的有元素名的向量,元素名是自變量的不同取值,結果的元素值是對應的頻數。單個因子或單個向量的頻數結果可以用向量的下標訪問方法取出單個頻數或若干個頻數的子集。

3.tapply()函數

可以按照因子分組然后每組計算另一變量的概括統計。如

x-c("男","女","男","男","女")

sex-factor(x)

h-c(165,170,168,172,159)

tapply(h,sex,mean)

返回:

4.forcats包的因子函數

如果使用此函數,需要先進行載入:

library(forcats)

在分類變量類數較多時,往往需要對因子水平另外排序、合并等,forcats包提供了一些針對因子的方便函數。

orcats::fac_reorder()可以根據不同因子水平分成的組中另一數值型變量的統計量值排序。如:

set.seed(1)

fac-sample(c("red","green","blue"),30,replace=TRUE)

fac-factor(fac,levels=c("red","green","blue"))

x-round(100*(10+rt(30,2)))

res1-tapply(x,fac,sd);res1

返回:

對上面數值畫條形圖:

barplot(res1)

返回:

如果希望按照統計量次序對因子排序,可以用forcats::fct_reorder()函數,并畫圖條形圖,如

fac2-fct_reorder(fac,x,sd)

res2-tapply(x,fac2,sd)

barplot(res2)

返回:

新的因子fac2的因子水平次序已經按照變量x的標準差從小到大排列。

有時在因子水平數較多時僅想將特定的一個或幾個水平次序放到因子水平最前面,可以用forcats::fct_relevel()函數,如:

levels(fac)

返回:

fac3-fct_relevel(fac,"blue");levels(fac3)

返回:

fct_relevel()第一個參數是要修改次序的因子,后續可以有多個字符型參數表示要提前的水平。

forcats::fct_reorder2(f,x,y)也調整因子f的水平的次序,但是根據與每組中最大的x值相對應的y值大小調整次序,這樣在作多個因子水平對應的曲線圖時可以比較容易地區分多條曲線。

forcats::fct_recode()可以修改每個水平的名稱,如:

fac4-fct_recode(

"紅"="red","綠"="green","藍"="blue")

table(fac4)

返回:

fct_recode()在修改水平名時允許多個舊水平對應到一個新水平,從而合并原來的水平。如果合并很多,可以用fct_collapse()函數,記得要先導入forcats包的因子函數,如

compf-fct_collapse(

comp,

"其它"=c("","無名","無應答"),

"聯想"=c("聯想","聯想集團"),

"百度"=c("百度","百度集團"))

如果某個因子頻數少的水平很多,在統計時有過多水平不易展示主要的類別,可以用forcats::fct_lump(f)合并,缺省地從最少的類合并一直到其它類超過其它最小的類之前,可以用n=參數指定要保留多少個類。

練習

設文件class.csv中包含如下內容:

name,sex,age,height,weight

Alice,F,13,56.5,84

Becka,F,13,65.3,98

Gail,F,14,64.3,90

Karen,F,12,56.3,77

Kathy,F,12,59.8,84.5

Mary,F,15,66.5,112

Sandy,F,11,51.3,50.5

Sharon,F,15,62.5,112.5

Tammy,F,14,62.8,102.5

Alfred,M,14,69,112.5

Duke,M,14,63.5,102.5

Guido,M,15,67,133

James,M,12,57.3,83

Jeffrey,M,13,62.5,84

John,M,12,59,99.5

Philip,M,16,72,150

Robert,M,12,64.8,128

Thomas,M,11,57.5,85

William,M,15,66.5,112

用如下程序把該文件讀入為R數據框d.class,其中的sex列已經自動轉換為因

子。取出其中的sex和age

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論