R學習 第九篇:因子


因子(factor)是R語言中比較特殊的一個數據類型, 它是一個用於存儲類別的類型,舉個例子,從性別上,可以把人分為:男人和女人,從年齡上划分,又可以把人分為:未成年人(<18歲),成年人(>=18)。R把表示分類的數據稱為因子,因子的行為有時像字符串,有時像整數。因子是一個向量,通常情況下,每個元素都是字符類型,也有其他數據類型的元素。因子具有因子水平(Levels),用於限制因子的元素的取值范圍,R強制:因子水平是字符類型,因子的元素只能從因子水平中取值,這意味着,因子的每個元素要么是因子水平中的字符(或轉換為其他數據類型),要么是缺失值,這是因子的約束,是語法上的規則。

一,創建因子

通常情況下,在創建數據框變量時,R隱式把數據類型為字符的列創建為因子,這是因為R會把文本類型默認為類別數據,並自動轉換為因子。

例如,創建一個數據框變量,通過class()函數檢查gender列的類,結果是因子類型,而不是字符向量:

heights <- data.frame(
  height_cm=c(156,182,170),
  gender=c('f','m','f')
)
> class(heights$gender)
[1] "factor"

還可以通過factor()函數創建因子,factor()函數的第一個參數必須是字符向量,通過levels參數顯式設置因子水平,

factor(x = character(), levels, labels = levels,
       exclude = NA, ordered = is.ordered(x), nmax = NA)

參數注釋:

  • x:是向量,通常是由少量唯一值的字符向量
  • levels:水平,字符類型,用於設置x可能包含的唯一值,默認值是x的所有唯一值。如果x不是字符向量,那么使用as.character(x)把x轉換為字符向量,然后獲取x向量的水平。x向量的取值跟levels有關。
  • labels:是水平的標簽,字符類型,用於對水平添加標簽,相當於對因子水平重命名;
  • exclude:排除的字符
  • ordered:邏輯值,用於指定水平是否有序;
  • nmax:水平的上限數量

例如,因子sex的值是向量c('f','m','f','f','m'),因子水平是c('f','m'):

> sex <- factor(c('f','m','f','f','m'),levels=c('f','m'))
> sex
[1] f m f f m
Levels: f m

二,因子水平

因子水平規定了因子取值的范圍,每一個因子,都包含因子水平的信息,例如,打印gender列,可以看到因子的元素和水平:

> heights$gender
[1] f m f
Levels: f m

該因子中的每個值都是一個字符串,它們被限制為“f”、“m”和缺失值(NA)。如果把其他字符串添加到gender列中,R會拋出警告消息,並把錯誤賦值的元素設置為NA,例如:

> heights$gender[1]<-"female"
Warning message:
In `[<-.factor`(`*tmp*`, 1, value = c(NA, 2L, 1L)) :
  invalid factor level, NA generated

1,查看因子水平

因子水平,可以通過函數levels(factor)來查看:

> levels(heights$gender)
[1] "f" "m"

水平的級數,相當於level的長度,可以由nlevels函數查詢到:

> nlevels(heights$gender)
[1] 2

2,因子水平的標簽

使用factor函數創建因子,可以使用labels參數為每個因子水平添加標簽,labels參數的字符順序,要和levels參數的字符順序保持一致,例如:

> sex=factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
> sex
[1] female male   female female male  
Levels: female < male

三,有序因子

通常情況下,因子一般是無序的,這可以通過is.ordered()函數來驗證:

> is.ordered(sex)
[1] FALSE

因子的順序,實際上是指因子水平的順序,有序因子的因子水平是有序的。在特殊情況下,有些因子的水平在語義上大於或小於其他水平,R支持按順序排列的因子,使用ordered函數,或通過給factor函數傳入order=TRUE參數,把無序因子轉換為有序的因子。

1,通過ordered()函數把現有因子轉換為有序因子

ordered()函數不能指定特定因子水平的順序,通常情況下,因子中先出現的水平小於后出現的水平。

例如,通過ordered函數把sex因子轉換為有序的因子:

> ordered(sex)
[1] f m f f m
Levels: f < m

2,創建有序的因子

通過factor函數創建有序因子,通過levels指定因子的順序。

> sex <- factor(c('f','m','f','f','m'),levels=c('f','m'),ordered=TRUE)
> sex
[1] f m f f m
Levels: f < m

3,按照指定的順序轉換現有的因子

因子的順序,其實是因子水平的順序,我們可以通過levels,使現有的因子按照指定的因子水平來排序。

例如,把heights數據庫框的gender,按照指定的levels,轉換成有序因子:

heights$gender <- factor(heights$gender, levels=c('m','f'),ordered=TRUE)

四,刪除因子水平

在數據清理時,可能需要去掉與因子水平對應的數據,通常情況下,需要刪除未使用的因子水平,可以使用droplevels函數,它接受因子或是數據框作為參數。

## S3 method for class 'factor'
droplevels(x, exclude = if(anyNA(levels(x))) NULL else NA, ...)
## S3 method for class 'data.frame'
droplevels(x, except, exclude, ...)

如果x是數據框,那么把數據框中未使用的因子刪除。

heights$gender <- droplevels(gender)

五,把因子水平轉換為字符串

在數據清理中,有時需要把因子轉換為字符,通常情況下,使用as.character()函數,把因子轉換為字符串:

> as.character(heights$gender)
[1] NA  "m" "f"

或者使用其他類型轉換函數,把因子轉換為特定的數據類型。

六,把因子轉換成相應的整數

使用as.numeric()或as.integer()函數可以把因子轉換成對應的整數

> as.integer(sex)
[1] 1 2 1 1 2

七,把連續變量分割為類別

函數cut()能夠把數值變量切成不同的塊,然后返回一個因子

cut(x, breaks, labels = NULL)

參數注釋:

  • x:數值變量
  • breaks:切割點向量
  • labels:每一個分組的標簽

例如,把身高數據,按照指定的切割點向量分割:

cut(heights$height_cm,c(150,170,190))
[1] (150,170] (170,190] (150,170]
Levels: (150,170] (170,190]

八,修改數據框中的因子

一般情況下,數據框中的字符類型的列會轉換為因子類型,要修改因子類型,一般通過三步來完成:

mydata$Category <- as.character(mydata$Category)
mydata <- within(mydata,{Category[Category=="old name"] <- "new name"})
mydata$Category <- as.factor(mydata$Category)

當需要把因子轉換為有序因子時,要注意因子水平的順序,

mydata$Category <- as.factor(mydata$Category, levels=c('your ordered'), ordered=TRUE)

 

 

參考文檔:

如何理解R中因子(factor)的概念?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM