因子(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)
參考文檔:
