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