20200511·Kony·Win10
因子
因子(factor):是名義型變量或有序型變量,比較特殊。一個因子不僅包括分類變量本身還包括變量不同的可能水平(即使它們在數(shù)據(jù)中不出現(xiàn))。
1. factor()的用法
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x), nmax = NA)
#factor (x,levels=sort(unique(x),na.last=TRUE), labels=lebels, exclude=NA, ordered=is.order (x))
- levels用于指定因子的可能水平;
- labels用于定義水平的名字;
- exclude指從向量x中剔除的水平值;
- ordered指因子的水平是否要排序
a <- factor(1:3)
a ###3個數(shù)據(jù),3個水平
## [1] 1 2 3
## Levels: 1 2 3
b<-factor(1:3, levels=1:5)
b ###3個數(shù)據(jù),5個水平,數(shù)據(jù)數(shù)比水平數(shù)大,其中兩個水平?jīng)]有出現(xiàn)
## [1] 1 2 3
## Levels: 1 2 3 4 5
2. factor 數(shù)據(jù)的名稱
c<-factor(1:3,labels=c("a","b","c"))
c
## [1] a b c
## Levels: a b c
d<-factor(1:3,levels=1:5,labels=c("a","b","c","d","e"))
d
## [1] a b c
## Levels: a b c d e
str()函數(shù)
str(c) #str即structure,緊湊的顯示對象內(nèi)部結(jié)構(gòu),即對象里有什么
# Factor w/ 3 levels "a","b","c": 1 2 3
#c有三個水平,名字分別為a,b,c
3. 將factor轉(zhuǎn)化為其他類型
3.1 數(shù)值型
d<-c(1,10) #建立向量a,值為1,10
d
## [1] 1 10
fac<-factor(d)
fac #提取向量a的因子數(shù),并賦給fac
## [1] 1 10
## Levels: 1 10
fac_value<-as.numeric(fac) #將fac轉(zhuǎn)化為數(shù)值
fac
## [1] 1 10
## Levels: 1 10
3.2 字符型
e<-c("Male","Female")
e #建立向量e,為字符型
## [1] "Male" "Female"
fac_e<-factor(e);fac_e #提取向量e的因子,并且賦給fac_e
## [1] Male Female
## Levels: Female Male
fac_e_value<-as.numeric(fac_e)#將fac_e轉(zhuǎn)化為數(shù)值型
fac_e_value
## [1] 2 1
3.3 將factor轉(zhuǎn)化為數(shù)值
as.numeric(as.character(fac))
## [1] 1:10
4. 將其他數(shù)據(jù)轉(zhuǎn)化為factor
4.1將字符轉(zhuǎn)換為因子
a<-c("RE","GR","BL")
a<-factor(a)
a
## [1] RE GR BL
## Levels: BL GR RE
levels(a)<-c(1,2,3,4)
a
## [1] 3 2 1
## Levels: 1 2 3 4
f<-factor(c("A","B","C",labels=c(1,2,3)))
f
## labels1 labels2 labels3
A B C 1 2 3
## Levels: 1 2 3 A B C
4.2 將數(shù)值轉(zhuǎn)換為因子
b <- c(1,2,3,1)
b <- factor(b)
b
## [1] 1 2 3 1
## Levels: 1 2 3
4.3 提取可能的因子
ff <- factor(c(2,4),levels=2:5)
ff
## [1] 2 4
## Levels: 2 3 4 5
levels(ff)
## [1] "2" "3" "4" "5"
4.4 將連續(xù)型數(shù)據(jù)轉(zhuǎn)換為因子
以PlantGrowth數(shù)據(jù)集為例說明,先看一下這個數(shù)據(jù)集:
pg <- PlantGrowth[c(1,2,11,21,22),]
pg
# weight group
# 1 4.17 ctrl
# 2 5.58 ctrl
# 11 4.81 trt1
# 21 6.31 trt2
# 22 5.12 trt2
在這個案例中,我們使用cut()函數(shù)把一個連續(xù)型變量weight轉(zhuǎn)化為分類變量wtclass
pg$wtclass <- cut(pg$weight,breaks=c(0,5,6,Inf))
pg
# weight group wtclass
# 1 4.17 ctrl (0,5]
# 2 5.58 ctrl (5,6]
# 11 4.81 trt1 (0,5]
# 21 6.31 trt2 (6,Inf]
# 22 5.12 trt2 (5,6]
我們?yōu)槿齻€類設(shè)定了四個邊界值,邊界值可以包括正無窮(Inf)和負(fù)無窮(-Inf),如果一個值落在我們規(guī)定的區(qū)間外,它的類別將被設(shè)定為NA(缺失值),cut()函數(shù)的結(jié)果是一個因素,并且因子水平的名稱是以生成的區(qū)間命名的
str(pg)
'data.frame': 5 obs. of 3 variables:
$ weight : num 4.17 5.58 4.81 6.31 5.12
$ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 2 3 3
$ wtclass: Factor w/ 3 levels "(0,5]","(5,6]",..: 1 2 1 3 2
但是這個區(qū)間名稱明顯不太方便,我們可以更改一下
pg$wtclass <-cut(pg$weight,breaks=c(0,5,6,Inf),
labels=c("Small","Medium","Large"))
# > pg
# weight group wtclass
# 1 4.17 ctrl Small
# 2 5.58 ctrl Medium
# 11 4.81 trt1 Small
# 21 6.31 trt2 Large
# 22 5.12 trt2 Medium
cut()函數(shù)生成的區(qū)間是左開右閉的,換句話說,它們不會包含最小值,但是它們包含了最大值,對于值最小的一類,可以通常設(shè)置參數(shù)include.lowest=TRUE來實現(xiàn),這樣它們就能同時包含最小值和最大值了,如果要讓生成的區(qū)間是左閉右開的,需要設(shè)定參數(shù)right=FALSE
pg$wtclass <- cut(pg$weight,breaks=c(0,5,6,Inf),right=FALSE)
# weight group wtclass
# 1 4.17 ctrl [0,5)
# 2 5.58 ctrl [5,6)
# 11 4.81 trt1 [0,5)
# 21 6.31 trt2 [6,Inf)
# 22 5.12 trt2 [5,6)
如果要更改不同因子的名稱,例如將Small改為A,Medium改為B,Large改為C,那么就需要car中的recode函數(shù)
head(pg)
# weight group wtclass
# 1 4.17 ctrl Small
# 2 5.58 ctrl Medium
# 11 4.81 trt1 Small
# 21 6.31 trt2 Large
# 22 5.12 trt2 Medium
library(car)
pg$wtclass <- recode(pg$wtclass,"'Small'='A';'Medium'='B';'Large'='C'")
head(pg)
# weight group wtclass
# 1 4.17 ctrl A
# 2 5.58 ctrl B
# 11 4.81 trt1 A
# 21 6.31 trt2 C
# 22 5.12 trt2 B
4.5生成指定的因子
seq()
在R的向量筆記中,提到了seq()函數(shù)用來生成某一條件的向量,這個函數(shù)在生成特定因子方面也有很重要的作用,用法為seq(length=, from=, to=),其中,length:指定生成個數(shù),from:是指開始生成的點,to:截止點。
seq(length=10,from=10,to=100) # 生成從10到100的向量,一共10個
## [1]10 20 3040 50 6070 80 90 100
# 上述命令等價于
seq(10,100,10)
## [1]10 20 3040 50 6070 80 90 100
seq(1,10,by=2)
## [1] 1 3 5 7 9
seq(1,10,length=6)
## [1] 1.02.8 4.6 6.48.2 10.0
sequence(2:3) #產(chǎn)生以 2 和 3 結(jié)尾的序列數(shù)據(jù)
## [1] 1 2 1 2 3
rep()
用法:rep(P,N),表示重復(fù)生成P值N次,例如rep(a1:a2,a1:a2) #重復(fù)a1到a2,按a1產(chǎn)生a1次,按a2產(chǎn)生a2次,當(dāng)rep(a1:a2,a1:a2)這種結(jié)構(gòu),后邊的a1:a2要小于前者
rep(1,10)
## [1] 1 1 1 1 1 1 1 1 1 1
rep(1:5,each=2, times=2) #重復(fù)1到5,每個元素重復(fù)二次,整個數(shù)列重復(fù)兩次
## [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5
rep(1:3,1:3) # 1重復(fù)1次,2重復(fù)2次,3重復(fù)3次
## [1] 1 2 2 3 3 3
gl()
生成規(guī)則的因子序列,gl(k,n):k為水平數(shù)據(jù),n是每個水平重復(fù)的次數(shù)
gl(3,5) #生成5個1,5個2,5個3,
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3
gl(3,5,length=30) #生成5個1,5個2,5個3,循環(huán)到30個,即:
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3
gl(2,6,label=c("Male","Female")) #生成Male與Female兩個因子,各6個,共12個數(shù)據(jù):
## [1] Male Male Male Male Male Male Female Female Female Female
## [11] Female Female
## Levels: Male Female
5. 有序因子
因子沒有順序,但也可以人為指定順序。例如糖尿病類型Diabetes(Type1,Type2),就是2種類型沒有順序,但病人狀態(tài)status(Poor,Imporved,Excellent)是有順序的
patientID<-c(1,2,3,4)
age<-c(25,34,28,52)
diabetes<-c("Type1","Type2","Type1","Type1")
status<-c("Poor","Improved","Excellent","Poor")
diabetes<-factor(diabetes) #提取不同糖尿病類型的因子
status<-factor(status,order=TRUE) # 提取因子,并且有序
patientdata<-data.frame(patientID,age,diabetes,status)
patientdata
## patientID age diabetes status
## 11 25 Type1Poor
## 22 34 Type2Improved
## 33 28 Type1 Excellent
## 44 52 Type1Poor
注:字符型向量的因子水平默認(rèn)依字母順序創(chuàng)建。但在實際情況中并不常用,而是通過levels選項來指定因子順序,使用
factor(status, order = TRUE, levels = c(“Poor”, “Improved”, “Excellent”)),
各個水平的賦值就為1 = Poor, 2 = Improved, 3 = Excellent
或是通過以下代碼實現(xiàn)
## [1] Poor ImprovedExcellent Poor
## Levels: Poor < Improved < Excellent
str(patientdata)#顯示數(shù)據(jù)框的結(jié)構(gòu)
## 'data.frame': 4 obs. of 4 variables:
## $ patientID: num 1 2 3 4
## $ age : num25 34 28 52
## $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
## $ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
summary(patientdata)
## patientID age diabetes status
## Min. :1.00Min. :25.00 Type1:3Excellent:1
## 1st Qu.:1.75 1st Qu.:27.25 Type2:1Improved :1
## Median :2.50 Median :31.00 Poor :2
## Mean :2.50Mean :34.75
## 3rd Qu.:3.25 3rd Qu.:38.50
## Max. :4.00Max. :52.00
6. factor的統(tǒng)計
如果一組數(shù)據(jù)有多個重復(fù)值,例如美國的每一個州都位于4個區(qū)域的中某一個,分別為東北,南、中北和西,則我們看一下內(nèi)置的state數(shù)據(jù)集:
head(state.region)
## [1] South West West South WestWest
## Levels: Northeast South North Central West
table(state.region)
## state.region
##Northeast South North Central West
##9 16 12 1