R中的基本数据类型之一是因子.根据我的经验,这些因素基本上是一种痛苦,我从不使用它们.我总是转换成角色.我奇怪地觉得我错过了什么.

在需要因子数据类型的情况下,是否有一些使用因子作为分组变量的函数的重要示例?当我使用因子时,是否有具体情况?

推荐答案

你应该使用因子.是的,它们可能是一种痛苦,但我的理论是,90%的痛苦是因为在read.tableread.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个传奇.如果你用角色向量伪造因子,你可能只会改变一个元素,并意外地创建一个单独的新关卡.

R相关问答推荐

指定要保留在wrap_plots中的传奇

过滤Expand.Grid的结果

将一个载体的值相加,直到达到另一个载体的值

使用Shiny组合和显示复制和粘贴的数据

从有序数据中随机抽样

从gtsummary包中使用tBL_strata()和tBL_summary()时删除变量标签

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

过滤器数据.基于两列的帧行和R中的外部向量

更改默认系列1以更改名称

如何调整曲线图中的y轴标签?

R Read.table函数无法对制表符分隔的数据正常工作

以相同的方式对每个表进行排序

为什么我使用geom_density的绘图不能到达x轴?

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

KM估计的差异:SvyKm与带权重的调查

我需要使用ggplot2制作堆叠条形图

在r中整理图例和堆叠图的问题

使用LAG和dplyr执行计算,以便按行和按组迭代

如何在shiny 的应用程序 map 视图宣传单中可视化单点

以R表示的NaN值的IS.NA状态