gpt4 book ai didi

r - R 中的因素 : more than an annoyance?

转载 作者:行者123 更新时间:2023-12-03 04:54:34 24 4
gpt4 key购买 nike

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

Warning message: In model.matrix.default(mt, mf, contrasts) :

variable Species converted to a factor

一件棘手的事情是整个 drop=TRUE少量。在向量中,这可以很好地消除数据中不存在的因素水平。例如:

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 s, [.data.frame() 的行为不同:参见this email?"[.data.frame" 。使用drop=TRUEdata.frame s 并不像你想象的那样工作:

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传说。

内部,factor s 是具有属性级别字符向量的整数(请参阅 attributes(iris$Species)class(attributes(iris$Species)$levels) ),这是干净的。如果您必须更改关卡名称(并且您使用的是字符串),那么这将是一个效率低得多的操作。我经常更改关卡名称,尤其是 ggplot传说。如果您使用字符向量伪造因子,则存在仅更改一个元素并意外创建单独的新关卡的风险。

关于r - R 中的因素 : more than an annoyance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com