R語言基礎教程 | 數(shù)據(jù)結構—因子

變量可歸結為名義型、有序型或連續(xù)型變量。名義型變量是沒有順序之分的類別變量。類別(名義型)變量和有序類別(有序型)變量在R中稱為因子(factor)。因子在R中非常重要,因為它決定了數(shù)據(jù)的分析方式以及如何進行視覺呈現(xiàn)。因子(factor)是R語言中比較特殊的一個數(shù)據(jù)類型, 它是一個用于存儲\color{red}{類別}的類型,舉個例子,從性別上,可以把人分為:男人和女人,從年齡上劃分,又可以把人分為:未成年人(<18歲),成年人(>=18)。

R把表示分類的數(shù)據(jù)稱為因子,因子的行為有時像字符串,有時像整數(shù)。因子是一個向量,通常情況下,每個元素都是字符類型,也有其他數(shù)據(jù)類型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范圍,R強制:因子水平是字符類型,因子的元素只能從因子水平中取值,這意味著,因子的每個元素要么是因子水平中的字符(或轉換為其他數(shù)據(jù)類型),要么是缺失值,這是因子的約束,是語法上的規(guī)則。

通常情況下,在創(chuàng)建數(shù)據(jù)框變量時,R隱式把數(shù)據(jù)類型為字符的列創(chuàng)建為因子,這是因為R會把文本類型默認為類別數(shù)據(jù),并自動轉換為因子。前面我們在講數(shù)據(jù)框時,就有提到。

> Birthdate <-c("1984-12-29","1983-5-6","1986-8-8")
> Name <-c("Devin","Edward","Wenli")
> Gender <-c("M","M","F")
> ID <- c(11,12,13)
> student<-data.frame(ID,Gender,Name,Birthdate)
> student
  ID Gender   Name  Birthdate
1 11      M  Devin 1984-12-29
2 12      M Edward   1983-5-6
3 13      F  Wenli   1986-8-8


> student$Gender
[1] M M F
Levels: F M

通過class()函數(shù)檢查gender列的類,結果是因子類型,而不是字符向量。

> class(student$Gender)
[1] "factor"

1.創(chuàng)建因子

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

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

參數(shù)注釋:

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

例如,因子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

2.因子水平

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

> student$Gender
[1] M M F
Levels: F M

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

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

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

> levels(student$Gender)
[1] "F" "M"

水平的級數(shù),相當于level的長度,可以由nlevels函數(shù)查詢到:

> nlevels(student$Gender)
[1] 2

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

> 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

3.有序因子

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

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

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

ordered()函數(shù)不能指定特定因子水平的順序,通常情況下,因子中先出現(xiàn)的水平小于后出現(xiàn)的水平。例如,通過ordered函數(shù)把sex因子轉換為有序的因子:

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

通過factor函數(shù)創(chuàng)建有序因子,通過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

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

例如,把heights數(shù)據(jù)框的gender,按照指定的levels,轉換成有序因子:

> heights <- data.frame(height_cm=c(156,182,170),gender=c('f','m','f'))
> heights 
  height_cm gender
1       156      f
2       182      m
3       170      f
> heights$gender
[1] f m f
Levels: f m
> heights$gender <- factor(heights$gender, levels=c('m','f'),ordered=TRUE)
> heights
  height_cm gender
1       156      f
2       182      m
3       170      f
> heights$gender
[1] f m f
Levels: m < f

4. 刪除因子水平

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

## S3 method for class 'factor'

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

heights$gender <- droplevels(heights$gender)

5.把因子水平轉換為字符串

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

> as.character(heights$gender)

6.把因子轉換成相應的整數(shù)

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

> as.integer(sex)

7.把連續(xù)變量分割為類別

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

cut(x, breaks, labels = NULL)

參數(shù)注釋:

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

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

cut(heights$height_cm,c(150,170,190))

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

mydata$Category <- as.character(mydata$Category)

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

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

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

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