Skip to content

R - 因子

因子(Factors)是 R 中一种特殊的数据类型,用于处理分类数据。它们对于统计建模和数据可视化至关重要,因为它们允许您定义一组固定的类别,称为水平(levels)。因子可以从字符向量和整数向量创建,对于具有有限数量唯一值(例如 "Male"/"Female" 或 "Low"/"Medium"/"High")的列特别有用。

因子是使用 factor() 函数创建的,该函数将向量作为其主要输入。理解因子对于基础 R 和现代数据分析工作流都至关重要。

现代 R 的重要注意事项: 自 R 4.0.0 版本(2020 年发布)以来,data.frame() 和 read.csv() 等函数的默认行为已发生变化。它们不再自动将字符向量转换为因子。旧的默认设置是 stringsAsFactors = TRUE,但新的默认设置是 stringsAsFactors = FALSE。这意味着您现在通常需要显式地创建因子,这让您对数据有更多的控制。

让我们从字符向量创建一个因子。请注意输出如何显示原始数据以及唯一的 Levels(水平)。

# 创建一个字符向量
directions <- c("East", "West", "East", "North", "North", "East", "West")
# 检查其类别以及它是否是因子
print(directions)
cat("Is it a factor? ", is.factor(directions), "\n")
# 应用 factor() 函数进行转换
factor_directions <- factor(directions)
# 检查结果
print(factor_directions)
cat("Is it a factor now? ", is.factor(factor_directions), "\n")

运行上述代码后,您将获得以下输出:

[1] "East" "West" "East" "North" "North" "East" "West"
Is it a factor? FALSE
[1] East West East North North East West
Levels: East North West
Is it a factor now? TRUE

如前所述,现代 R 不会自动从字符串创建因子。让我们看看实际情况,然后显式地转换该列。

# 为我们的数据框创建向量
height <- c(132, 151, 162, 139, 166, 147, 122)
weight <- c(48, 49, 66, 53, 67, 52, 40)
gender <- c("male", "male", "female", "female", "male", "female", "male")
# 创建数据框
employee_data <- data.frame(height, weight, gender)
print(employee_data)
# 测试 gender 列是否是因子(默认情况下不会)
cat("Is 'gender' a factor by default? ", is.factor(employee_data$gender), "\n")
cat("What is the class of 'gender'? ", class(employee_data$gender), "\n\n")
# 现在,我们将其转换为因子
employee_data$gender <- factor(employee_data$gender)
# 再次检查
cat("Is 'gender' a factor now? ", is.factor(employee_data$gender), "\n")
# 打印 gender 列以查看其水平
print(employee_data$gender)

执行此代码演示了现代工作流:

height weight gender
1 132 48 male
2 151 49 male
3 162 66 female
4 139 53 female
5 166 67 male
6 147 52 female
7 122 40 male
Is 'gender' a factor by default? FALSE
What is the class of 'gender'? character
Is 'gender' a factor now? TRUE
[1] male male female female male female male
Levels: female male

因子中水平的顺序默认为字母顺序。您可以更改此顺序,这对于可视化和建模非常重要(例如,设置基准类别)。

您可以使用 levels 参数重新应用 factor() 函数来指定所需的顺序。

# 我们之前的原始因子
directions <- c("East", "West", "East", "North")
factor_directions <- factor(directions)
cat("Original Factor Levels:\n")
print(factor_directions)
# 重新排序水平
ordered_factor <- factor(factor_directions, levels = c("North", "East", "West"))
cat("\nReordered Factor Levels:\n")
print(ordered_factor)

输出显示了新的水平顺序:

Original Factor Levels:
[1] East West East North
Levels: East North West
Reordered Factor Levels:
[1] East West East North
Levels: North East West

使用 forcats 包的现代 tidyverse 方法

Section titled “使用 forcats 包的现代 tidyverse 方法”

forcats 包(tidyverse 的一部分)提供了一套直观的函数,用于处理因子。fct_relevel() 函数非常适合重新排序。

# 首先,确保您已安装 tidyverse:install.packages("tidyverse")
library(forcats)
# 使用相同的因子
factor_directions <- factor(c("East", "West", "East", "North"))
# 使用 fct_relevel 将 "North" 提前
forcats_reordered <- fct_relevel(factor_directions, "North")
cat("Reordered with forcats:\n")
print(forcats_reordered)
# 您也可以指定完整的顺序
forcats_reordered_full <- fct_relevel(factor_directions, "North", "East", "West")
print(levels(forcats_reordered_full))

forcats 方法对于复杂操作通常更具可读性和强大性。

Reordered with forcats:
[1] East West East North
Levels: North East West
[1] "North" "East" "West"

gl() 函数(生成水平)是一个方便的工具,用于创建平衡、重复的因子结构,常用于实验设计或创建样本数据。

gl(n, k, labels)
  • n:一个整数,指定水平的数量。
  • k:一个整数,指定每个水平的重复次数。
  • labels:一个字符向量,提供因子水平的标签。

让我们生成一个有 3 个水平、每个水平重复 4 次的因子。

v <- gl(3, 4, labels = c("Tampa", "Seattle", "Boston"))
print(v)

输出清晰地显示了生成的因子:

[1] Tampa Tampa Tampa Tampa Seattle Seattle Seattle Seattle Boston Boston Boston Boston
Levels: Tampa Seattle Boston