当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。