R入門Day6:數(shù)據(jù)類型5---因子

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

R語言基礎(chǔ)--數(shù)據(jù)類型之因子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容