R - 因子
R - 因子
Section titled “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 WestLevels: East North WestIs it a factor now? TRUE数据框中的因子
Section titled “数据框中的因子”如前所述,现代 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 gender1 132 48 male2 151 49 male3 162 66 female4 139 53 female5 166 67 male6 147 52 female7 122 40 maleIs 'gender' a factor by default? FALSEWhat is the class of 'gender'? character
Is 'gender' a factor now? TRUE[1] male male female female male female maleLevels: female male管理因子水平
Section titled “管理因子水平”因子中水平的顺序默认为字母顺序。您可以更改此顺序,这对于可视化和建模非常重要(例如,设置基准类别)。
基础 R 方法
Section titled “基础 R 方法”您可以使用 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 NorthLevels: East North West
Reordered Factor Levels:[1] East West East NorthLevels: 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 NorthLevels: North East West[1] "North" "East" "West"生成因子水平
Section titled “生成因子水平”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 BostonLevels: Tampa Seattle Boston