R中的基本数据类型之一是因子.根据我的经验,这些因素基本上是一种痛苦,我从不使用它们.我总是转换成角色.我奇怪地觉得我错过了什么.
在需要因子数据类型的情况下,是否有一些使用因子作为分组变量的函数的重要示例?当我使用因子时,是否有具体情况?
R中的基本数据类型之一是因子.根据我的经验,这些因素基本上是一种痛苦,我从不使用它们.我总是转换成角色.我奇怪地觉得我错过了什么.
在需要因子数据类型的情况下,是否有一些使用因子作为分组变量的函数的重要示例?当我使用因子时,是否有具体情况?
你应该使用因子.是的,它们可能是一种痛苦,但我的理论是,90%的痛苦是因为在read.table
和read.csv
中,默认情况下,参数stringsAsFactors = TRUE
(大多数用户忽略了这一微妙之处).我说它们很有用,因为lme4等模型拟合包使用因子和有序因子来差异拟合模型,并确定要使用的对比度类型.图形包也使用它们来分组.ggplot
和大多数模型拟合函数将特征向量强制为因子,因此结果是相同的.但是,最终代码中会出现警告:
lm(Petal.Length ~ -1 + Species, data=iris)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
警告信息:在
model.matrix.default(mt, mf, contrasts)
:变量
Species
转换为factor
一件棘手的事情是整个drop=TRUE
位.在向量中,这可以很好地go 除数据中没有的因素级别.例如:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
However,对于data.frame
,[.data.frame()
的行为是不同的:见this email或?"[.data.frame"
.在data.frame
上使用drop=TRUE
并不像你想象的那样有效:
x <- subset(iris, Species == 'setosa', drop=TRUE) # susbetting with [ behaves the same way
x$Species
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
幸运的是,您可以轻松地使用droplevels()
来删除单个因子或data.frame
中每个因子的未使用因子级别(自R 2.12起):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
这是如何让你从ggplot
个传奇人物中 Select 的等级保持不变.
在内部,factor
是带有属性级字符向量的整数(参见attributes(iris$Species)
和class(attributes(iris$Species)$levels)
),这是干净的.如果您必须更改级别名称(并且使用字符串),这将是一个效率较低的操作.我经常更改关卡名称,尤其是ggplot
个传奇.如果你用角色向量伪造因子,你可能只会改变一个元素,并意外地创建一个单独的新关卡.