首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >R中的因素:不仅仅是一种烦恼?

R中的因素:不仅仅是一种烦恼?
EN

Stack Overflow用户
提问于 2010-08-10 09:06:29
回答 8查看 24K关注 0票数 96

R中的一种基本数据类型是因子。在我的经验中,因素基本上是一种痛苦,我从来没有使用过它们。我总是转换成角色。奇怪的是我好像错过了什么。

有没有一些使用factor作为分组变量的函数的重要示例,其中factor数据类型是必需的?有没有特定的情况下我应该使用因子?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-10 09:52:26

你应该使用因子。是的,它们可能会令人痛苦,但我的理论是,90%的原因是因为在read.tableread.csv中,默认的参数是stringsAsFactors = TRUE (大多数用户忽略了这一微妙之处)。我之所以说它们是有用的,是因为像lme4这样的模型拟合软件包使用因子和有序因子来以不同的方式拟合模型并确定要使用的对比度类型。而绘图包也使用它们来分组。ggplot和大多数模型拟合函数将特征向量强制为因子,因此结果是相同的。但是,您的代码中最终会出现警告:

代码语言:javascript
复制
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)中:

转换为factor的变量Species

一件棘手的事情是整个drop=TRUE部分。在向量中,这可以很好地删除数据中不存在的因素级别。例如:

代码语言:javascript
复制
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

但是,对于data.frame[.data.frame()的行为是不同的:请参见this email?"[.data.frame"。在data.frame%s上使用drop=TRUE不会像您想象的那样工作:

代码语言:javascript
复制
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开始):

代码语言:javascript
复制
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa"     "versicolor" "virginica" 
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"

这就是如何保持你从out in ggplot legends中选择的关卡。

在内部,factor是带有属性级字符向量的整数(请参见attributes(iris$Species)class(attributes(iris$Species)$levels)),这是干净的。如果您必须更改级别名称(并且您使用的是字符串),这将是一个效率较低的操作。而且我经常更改关卡名称,特别是对于ggplot传奇。如果你用字符向量来伪造因子,就有可能只改变一个元素,并意外地创建一个单独的新级别。

票数 49
EN

Stack Overflow用户

发布于 2010-08-10 15:37:27

有序因子是很棒的,如果我碰巧喜欢橙子,讨厌苹果,但不介意葡萄,我不需要管理一些奇怪的指数来这么说:

代码语言:javascript
复制
d <- data.frame(x = rnorm(20), f = sample(c("apples", "oranges", "grapes"), 20, replace = TRUE, prob = c(0.5, 0.25, 0.25)))
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
d[d$f >= "grapes", ]
票数 30
EN

Stack Overflow用户

发布于 2013-10-17 00:08:01

factor最类似于其他语言中的枚举类型。它的适当用法是用于只能接受指定值集中的一个值的变量。在这些情况下,并不是每个可能的允许值都可能出现在任何特定的数据集中,而“空”级别准确地反映了这一点。

考虑一些例子。对于在美国各地收集的一些数据,应该将州记录为一个因素。在这种情况下,没有从特定州收集案例的事实是相关的。可能有来自那个状态的数据,但发生了(无论出于什么原因,这可能是一个有趣的原因)。如果收集了家乡,那就不是一个因素了。没有预先声明的一组可能的家乡。如果数据是从三个城镇而不是全国收集的,城镇将是一个因素:一开始给出了三个选择,如果在这三个城镇中的一个城镇没有发现相关的案例/数据,那就是相关的。

factor的其他方面,例如为一组字符串提供任意排序顺序的方法,是factor的有用的次要特征,但不是它们存在的原因。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3445316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档