R語(yǔ)言因子類型的實(shí)現(xiàn)
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)?strong>因子實(shí)際保存為整數(shù)值,所以對(duì)因子進(jìn)行一些字符型操作可能導(dǎo)致錯(cuò)誤。用 as.character() 可以把因子轉(zhuǎn)換成原來(lái)的字符型,如
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 的不同值來(lái)求得??梢杂?strong>選項(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ū)σ蜃优判?/strong>,可以用 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( fac, " 紅"="red", " 綠"="green", " 藍(lán)"="blue") table(fac4)
返回:
fct_recode() 在修改水平名時(shí)允許多個(gè)舊水平對(duì)應(yīng)到一個(gè)新水平,從而合并原來(lái)的水平。如果合并很多,可以用 fct_collapse() 函數(shù),記得要先導(dǎo)入forcats 包的因子函數(shù),如
compf <- fct_collapse( comp, " 其它"=c("", " 無(wú)名", " 無(wú)應(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 列到變量 sex 和 age 中
d.class <- read.csv('class.csv', header=TRUE) sex <- d.class[,'sex'] age <- d.class[,'age']
(1) 統(tǒng)計(jì)并顯示列出 sex 的不同值頻數(shù);
(2) 分男女兩組分別求年齡最大值;
(3) 把 sex 變量轉(zhuǎn)換為一個(gè)新的因子, F 顯示成 “Female” , M 顯示成 “Male” 。
到此這篇關(guān)于R語(yǔ)言因子類型的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)R語(yǔ)言因子類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語(yǔ)言-使用ifelse進(jìn)行數(shù)據(jù)分組
這篇文章主要介紹了R語(yǔ)言-使用ifelse進(jìn)行數(shù)據(jù)分組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-04-04R語(yǔ)言數(shù)據(jù)可視化繪圖Lollipop?chart棒棒糖圖
這篇文章主要介紹了R語(yǔ)言數(shù)據(jù)可視化繪圖Lollipop?chart棒棒糖圖2022-02-02R語(yǔ)言因子型數(shù)值轉(zhuǎn)數(shù)值型的操作
這篇文章主要介紹了R語(yǔ)言因子型數(shù)值轉(zhuǎn)數(shù)值型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-04-04R語(yǔ)言如何畫豎線、橫線、添加標(biāo)簽以及畫固定長(zhǎng)度的線段
R語(yǔ)言繪圖的能力非常強(qiáng)大,有時(shí)看似繁復(fù)的圖形不過寥寥數(shù)行代碼就搞定,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言如何畫豎線、橫線、添加標(biāo)簽以及畫固定長(zhǎng)度的線段的相關(guān)資料,需要的朋友可以參考下2022-11-11R語(yǔ)言給圖形填充顏色的操作(polygon函數(shù))
這篇文章主要介紹了R語(yǔ)言給圖形填充顏色的操作(polygon函數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-03-03R語(yǔ)言ggplot2拼圖包patchwork安裝使用
這篇文章主要介紹了R語(yǔ)言ggplot2拼圖包patchwork安裝使用的圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解
這篇文章主要介紹了R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解,文中內(nèi)容講解的很透徹,有感興趣的同學(xué)可以學(xué)習(xí)下2021-03-03解決R語(yǔ)言安裝時(shí)出現(xiàn)輯程包不存在的問題
這篇文章主要介紹了解決R語(yǔ)言安裝時(shí)出現(xiàn)輯程包不存在的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-04-04R語(yǔ)言ComplexHeatmap繪制復(fù)雜熱圖heatmap
ComplexHeatmap可以繪制很復(fù)雜的熱圖,能滿足日常以及文章所需,本文介紹一下文章常見的復(fù)雜熱圖的繪制方式,含代碼,文章比較長(zhǎng),建議耐心看一下,也許就有你需要的熱圖2022-06-06