R語言因子類型的實(shí)現(xiàn)_第1頁
R語言因子類型的實(shí)現(xiàn)_第2頁
R語言因子類型的實(shí)現(xiàn)_第3頁
R語言因子類型的實(shí)現(xiàn)_第4頁
R語言因子類型的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

1.因子

R中用因子代表數(shù)據(jù)中分類變量,如性別、省份、職業(yè)。有序因子代表有序量度,如打分結(jié)果,疾病嚴(yán)重程度等。

用factor()函數(shù)把字符型向量轉(zhuǎn)換成因子,如

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

sex-factor(x)

sex

返回:

attributes(sex)

返回:

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

levels(sex)

返回:

因子的levels屬性可以看成是一個(gè)映射,把整數(shù)值1,2,...映射成這些水平值,因子在保存時(shí)會(huì)保存成整數(shù)值1,2,...等與水平值對(duì)應(yīng)的編號(hào)。這樣可以節(jié)省存儲(chǔ)空間,在建模計(jì)算的程序中也比較有利于進(jìn)行數(shù)學(xué)運(yùn)算。

事實(shí)上,read.csv()函數(shù)的默認(rèn)操作會(huì)把輸入文件的字符型列自動(dòng)轉(zhuǎn)換成因子,這對(duì)于性別、職業(yè)、地名這樣的列是合適的,但是對(duì)于姓名、日期、詳細(xì)地址這樣的列則不合適。所以,在read.csv()調(diào)用中經(jīng)常加選項(xiàng)stringsAsFactors=FALSE選項(xiàng)禁止這樣的自動(dòng)轉(zhuǎn)換,還可以用colClasses選項(xiàng)逐個(gè)指定每列的類型。

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

as.numeric(sex)

返回:

因?yàn)橐蜃訉?shí)際保存為整數(shù)值,所以對(duì)因子進(jìn)行一些字符型操作可能導(dǎo)致錯(cuò)誤。用as.character()可以把因子轉(zhuǎn)換成原來的字符型,如

as.character(sex)

返回:

為了對(duì)因子執(zhí)行字符型操作(如取子串),保險(xiǎn)的做法是先用as.character()函數(shù)強(qiáng)制轉(zhuǎn)換為字符型。

factor()函數(shù)的一般形式為

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

labels,exclude=NA,ordered=FALSE)

可以用選項(xiàng)levels自行指定各水平值,不指定時(shí)由x的不同值來求得??梢杂眠x項(xiàng)labels指定各水平的標(biāo)簽,不指定時(shí)用各水平值的對(duì)應(yīng)字符串。可以用exclude選項(xiàng)指定要轉(zhuǎn)換為缺失值(NA)的元素值集合。如果指定了levels,則當(dāng)自變量x的某個(gè)元素等于第j個(gè)水平值時(shí)輸出的因子對(duì)應(yīng)元素值取整數(shù)j,如果該元素值沒有出現(xiàn)在levels中則輸出的因子對(duì)應(yīng)元素值取NA。ordered取真值時(shí)表示因子水平是有次序的(按編碼次序)。

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

因?yàn)橐粋€(gè)因子的levels屬性是該因子獨(dú)有的,所以合并兩個(gè)因子有可能造成錯(cuò)誤,但在最新版本4.1.2沒有報(bào)錯(cuò),應(yīng)跟版本有關(guān),如

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

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

c(li1,li2)

返回:

如果結(jié)果不是因子的話,需要對(duì)其進(jìn)行轉(zhuǎn)換。則那樣正確的做法是

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

就是先轉(zhuǎn)換為字符型,再進(jìn)行合并就可以了。

2.table()函數(shù)

用table()函數(shù)統(tǒng)計(jì)因子各水平的出現(xiàn)次數(shù)(稱為頻數(shù)或頻率)。也可以對(duì)一般的向量統(tǒng)計(jì)每個(gè)不同元素的出現(xiàn)次數(shù)。如

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

sex-factor(x)

table(sex)

返回:

對(duì)一個(gè)變量用table函數(shù)計(jì)數(shù)的結(jié)果是一個(gè)特殊的有元素名的向量,元素名是自變量的不同取值,結(jié)果的元素值是對(duì)應(yīng)的頻數(shù)。單個(gè)因子或單個(gè)向量的頻數(shù)結(jié)果可以用向量的下標(biāo)訪問方法取出單個(gè)頻數(shù)或若干個(gè)頻數(shù)的子集。

3.tapply()函數(shù)

可以按照因子分組然后每組計(jì)算另一變量的概括統(tǒng)計(jì)。如

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

sex-factor(x)

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

tapply(h,sex,mean)

返回:

4.forcats包的因子函數(shù)

如果使用此函數(shù),需要先進(jìn)行載入:

library(forcats)

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

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

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

返回:

對(duì)上面數(shù)值畫條形圖:

barplot(res1)

返回:

如果希望按照統(tǒng)計(jì)量次序?qū)σ蜃优判?,可以用forcats::fct_reorder()函數(shù),并畫圖條形圖,如

fac2-fct_reorder(fac,x,sd)

res2-tapply(x,fac2,sd)

barplot(res2)

返回:

新的因子fac2的因子水平次序已經(jīng)按照變量x的標(biāo)準(zhǔn)差從小到大排列。

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

levels(fac)

返回:

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

返回:

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

forcats::fct_reorder2(f,x,y)也調(diào)整因子f的水平的次序,但是根據(jù)與每組中最大的x值相對(duì)應(yīng)的y值大小調(diào)整次序,這樣在作多個(gè)因子水平對(duì)應(yīng)的曲線圖時(shí)可以比較容易地區(qū)分多條曲線。

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

fac4-fct_recode(

"紅"="red","綠"="green","藍(lán)"="blue")

table(fac4)

返回:

fct_recode()在修改水平名時(shí)允許多個(gè)舊水平對(duì)應(yīng)到一個(gè)新水平,從而合并原來的水平。如果合并很多,可以用fct_collapse()函數(shù),記得要先導(dǎo)入forcats包的因子函數(shù),如

compf-fct_collapse(

comp,

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

"聯(lián)想"=c("聯(lián)想","聯(lián)想集團(tuán)"),

"百度"=c("百度","百度集團(tuán)"))

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

練習(xí)

設(shè)文件class.csv中包含如下內(nèi)容:

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數(shù)據(jù)框d.class,其中的sex列已經(jīng)自動(dòng)轉(zhuǎn)換為因

子。取出其中的sex和age

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論