Skip to content

R - 条件判断

决策结构是任何编程语言的基础。它们允许程序评估条件,并根据条件为真或假来执行不同的代码块。这使得程序行为动态且响应迅速。

典型的决策结构首先评估一个逻辑条件。如果条件为 TRUE(真),则执行一个或多个语句。可选地,如果条件为 FALSE(假),则可以运行另一组语句。现代 R 提供了传统的程序控制流工具,也提供了数据分析中常见的、高效的矢量化条件逻辑工具。

这些结构用于控制脚本的执行路径。它们非常适合检查用户输入、处理错误或指导程序逻辑等任务。

if 语句在条件为真时执行一个代码块。它可以与 else 语句配对使用,以便在条件为假时提供一个备选的代码块来运行。

x <- -5
if (x > 0) {
print("x is a positive number")
} else if (x < 0) {
print("x is a negative number")
} else {
print("x is zero")
}

switch 语句提供了一种简洁的方式,用于根据变量的可能值列表进行测试,并为每个值执行不同的操作。

operation <- "mean"
data_vector <- c(10, 20, 30, 40, 50)
result <- switch(operation,
"mean" = mean(data_vector),
"sum" = sum(data_vector),
"median" = median(data_vector),
stop("Invalid operation specified") # 没有匹配时的默认情况
)
print(paste("The", operation, "is:", result))

适用于数据分析的现代条件逻辑

Section titled “适用于数据分析的现代条件逻辑”

在处理数据框(data frames)时,对整个列执行条件逻辑是一项常见任务。虽然你可以使用循环结合 if-else,但 R 为此提供了更高效、更易读的矢量化函数。

case_when() 是在数据分析工作流中处理多个条件的现代、强大且推荐的方式。它是 tidyverse 中复杂嵌套 if-else 语句的等效替代品,但更易读。它通常在 dplyr::mutate() 内部使用,以创建新列。

其语法为 condition ~ value,其中 condition 是一个逻辑测试,value 是满足该条件时要赋的值。case_when() 按顺序评估条件,并在第一个 TRUE(真)条件处停止。

# 加载必要的库
library(dplyr)
library(tibble)
# 学生样本数据
student_grades <- tibble(
student_id = 1:6,
score = c(95, 82, 75, 68, 89, 55)
)
# 使用 case_when() 创建新的 'letter_grade' 列
grades_with_letters <- student_grades |>
mutate(
letter_grade = case_when(
score >= 90 ~ "A",
score >= 80 ~ "B",
score >= 70 ~ "C",
score >= 60 ~ "D",
.default = "F" # 指定默认值的安全方式
)
)
print(grades_with_letters)

执行此代码会根据指定的逻辑清晰地添加一个新列:

# A tibble: 6 × 3
student_id score letter_grade
<int> <dbl> <chr>
1 1 95 A
2 2 82 B
3 3 75 C
4 4 68 D
5 5 89 B
6 6 55 F

以下是选择合适工具的简单指南。

语句主要用途
if / else if / else通用程序控制流。处理单个、非矢量化条件。最适合脚本逻辑、错误处理或函数控制。
switch()基于单个变量的精确值进行简单分派。适用于路由到不同的函数。
dplyr::case_when()数据操作的首选方法。 在 mutate() 内部使用,根据多个复杂条件在数据框中创建新列。它具有矢量化、易读性和鲁棒性。