當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


R factor 因子

R語言 factor 位於 base 包(package)。

說明

函數 factor 用於將向量編碼為因子(術語 ‘category’ 和“枚舉類型”也用於因子)。如果參數 orderedTRUE ,則假定因子級別已排序。為了與 S 兼容,還有一個函數 ordered

is.factoris.orderedas.factoras.ordered 是這些類的成員函數和強製函數。

用法

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

ordered(x = character(), ...)

is.factor(x)
is.ordered(x)

as.factor(x)
as.ordered(x)

addNA(x, ifany = FALSE)

.valid.factor(object)

參數

x

數據向量,通常采用少量不同的值。

levels

唯一值(作為字符串)的可選向量x可能已經采取了。默認值是唯一的一組值as.character(x),按升序排列x。請注意,該集合可以指定為小於sort(unique(x)).

labels

級別標簽的可選字符向量(刪除 exclude 中的標簽後,順序與 levels 相同),或長度為 1 的字符串。 labels 中的重複值可用於映射不同的值x 達到相同的因子水平。

exclude

形成水平集時要排除的值向量。這可能是與 x 設置相同級別的因子,或者應該是 character

ordered

邏輯標誌來確定級別是否應被視為有序(按給定的順序)。

nmax

級別數的上限;查看具體信息'。

...

(在 ordered(.) 中):除 ordered 本身之外的任何上述內容。

ifany

僅在使用時添加 NA 級別,即 any(is.na(x))

object

一個R對象。

細節

向量x的類型不受限製;它隻必須具有 as.character 方法並且可排序(通過 order )。

有序因子與因子僅在類別上有所不同,但方法和模型擬合函數對這兩個類別的處理方式卻截然不同。

向量的編碼如下。首先,exclude 中的所有值都從 levels 中刪除。如果 x[i] 等於 levels[j] ,則結果的第 i 元素為 j 。如果在 levels 中未找到 x[i] 的匹配項(這對於排除的值會發生),則結果的第 i 元素將設置為 NA

通常,用作結果屬性的 ‘levels’ 是刪除 exclude 中的級別後減少的級別集,但這可以通過提供 labels 來更改。這應該是級別的一組新標簽,或者是一個字符串,在這種情況下,級別是附加了序列號的字符串。

factor(x, exclude = NULL)應用於沒有的因子NAs 是 no-operation,除非有未使用的級別:在這種情況下,將返回具有縮減級別集的因子。如果exclude被使用,因為R3.4.0版本,排除不存在的字符級別相當於什麽都不排除,並且當exclude是一個character向量,即應用於水平x。或者,exclude可以是具有相同水平設置的因子x並將排除中存在的水平exclude.

因子的代碼可能包含 NA 。對於數字 x ,設置 exclude = NULL 以使 NA 成為一個額外級別(打印為 <NA> );默認情況下,這是最後一個級別。

如果NA 是一個級別,則將代碼設置為缺失的方法(與缺失級別的代碼相反)是在賦值的左側使用is.na(如is.na(f)[i] <- TRUE 中所示) ;is.na 內部的索引不起作用)。在這種情況下,缺失值當前打印為 <NA> ,即與 NA 級別的條目相同。

is.factor 是通用的:您可以編寫方法來處理特定類的對象,請參閱 InternalMethods

如果未提供levels,則調用unique。由於因子通常具有相當少的級別,因此對於大型向量 x,提供 nmax 作為唯一值數量的上限會很有幫助。

當使用c將一個(可能有序的)因子與其他對象組合時,如果所有對象都是(可能有序的)因子,則結果將是一個具有級別的因子,即元素級別集的並集,按級別的順序排列發生在元素的水平集中(這意味著如果所有元素具有相同的水平集,即結果的水平集),相當於unlist對因子對象列表的操作。

factor 返回 "factor" 類的對象,該對象具有一組長度為 x 的整數代碼,具有 character 模式的 "levels" 屬性和唯一 ( !anyDuplicated(.) ) 條目。如果參數 ordered 為 true(或使用 ordered()),則結果具有類 c("ordered", "factor") 。很長一段時間以來,factor(x) 丟失了除 "names" 之外的所有 attributes(x) ,並重置了 "levels""class"

factor 應用於有序或無序因子會返回一個僅包含出現級別的因子(相同類型):另請參閱 [.factor 以更透明的方式實現此目的。

is.factor 返回TRUEFALSE,具體取決於其參數是否為因子類型。相應地,當 is.ordered 的參數是有序因子時,它返回 TRUE,否則返回 FALSE

as.factor 將其參數強製為一個因子。它是 factor 的縮寫形式(有時更快)。

如果已排序,as.ordered(x) 返回x,否則返回ordered(x)

addNA 通過將 NA 轉換為額外級別來修改因子(例如,以便將 NA 值計入表中)。

.valid.factor(object) 檢查一個因子的有效性,目前隻有levels(object) ,如果有效則返回TRUE,否則返回說明有效性問題的字符串。該函數用於validObject(<factor>)

警告

因子的解釋取決於代碼和 "levels" 屬性。僅小心比較具有相同水平集(以相同順序)的因子。特別是,應用於因子的 as.numeric 是沒有意義的,並且可能通過隱式強製轉換發生。要將因子 f 轉換為近似其原始數值,建議使用 as.numeric(levels(f))[f] ,它比 as.numeric(as.character(f)) 效率稍高。

默認情況下,因子的級別已排序,但排序順序很可能取決於創建時的區域設置,並且不應假定為 ASCII。

有一些異常與具有 NA 級別的因子相關。建議謹慎使用它們,例如僅用於製表目的。

比較運算符和組泛型方法

group generic Ops"factor""ordered" 方法,它們為 Comparison 運算符以及 Summary 中的 minmaxrange 泛型提供方法的 "ordered" 。 (其餘組和 Math 組會生成錯誤,因為它們對因子沒有意義。)

隻有 ==!= 可用於因子:一個因子隻能與具有相同級別集(不一定具有相同順序)的另一個因子或字符向量進行比較。有序因子以相同的方式進行比較,但一般調度機製不允許比較有序因子和無序因素。

所有比較運算符都可用於有序因子。排序規則是通過操作數的級別完成的:如果兩個操作數都是有序因子,則它們必須具有相同的級別集。

注意

在早期版本中R,如果重複的比例很小,則將字符數據存儲為一個因子會更節省空間。然而,相同的字符串現在共享存儲,因此在大多數情況下差異很小。 (整數值存儲在 4 個字節中,而每個對字符串的引用需要 4 或 8 個字節的指針。)

例子

(ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))
as.integer(ff)      # the internal codes
(f. <- factor(ff))  # drops the levels that do not occur
ff[, drop = TRUE]   # the same, more transparently

factor(letters[1:20], labels = "letter")

class(ordered(4:1)) # "ordered", inheriting from "factor"
z <- factor(LETTERS[3:1], ordered = TRUE)
## and "relational" methods work:
stopifnot(sort(z)[c(1,3)] == range(z), min(z) < max(z))


## suppose you want "NA" as a level, and to allow missing values.
(x <- factor(c(1, 2, NA), exclude = NULL))
is.na(x)[2] <- TRUE
x  # [1] 1    <NA> <NA>
is.na(x)
# [1] FALSE  TRUE FALSE

## More rational, since R 3.4.0 :
factor(c(1:2, NA), exclude =  "" ) # keeps <NA> , as
factor(c(1:2, NA), exclude = NULL) # always did
## exclude = <character>
z # ordered levels 'A < B < C'
factor(z, exclude = "C") # does exclude
factor(z, exclude = "B") # ditto

## Now, labels maybe duplicated:
## factor() with duplicated labels allowing to "merge levels"
x <- c("Man", "Male", "Man", "Lady", "Female")
## Map from 4 different values to only two levels:
(xf <- factor(x, levels = c("Male", "Man" , "Lady",   "Female"),
                 labels = c("Male", "Male", "Female", "Female")))
#> [1] Male   Male   Male   Female Female
#> Levels: Male Female

## Using addNA()
Month <- airquality$Month
table(addNA(Month))
table(addNA(Month, ifany = TRUE))

參考

Chambers, J. M. and Hastie, T. J. (1992) Statistical Models in S. Wadsworth & Brooks/Cole.

也可以看看

[.factor 用於因子子集。

gl 用於構建平衡因子,C 用於具有指定對比的因子。 levelsnlevels用於訪問級別,unclass用於獲取整數代碼。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Factors。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。