R - 条件判断
R - 决策与控制流
Section titled “R - 决策与控制流”决策结构是任何编程语言的基础。它们允许程序评估条件,并根据条件为真或假来执行不同的代码块。这使得程序行为动态且响应迅速。
典型的决策结构首先评估一个逻辑条件。如果条件为 TRUE(真),则执行一个或多个语句。可选地,如果条件为 FALSE(假),则可以运行另一组语句。现代 R 提供了传统的程序控制流工具,也提供了数据分析中常见的、高效的矢量化条件逻辑工具。
这些结构用于控制脚本的执行路径。它们非常适合检查用户输入、处理错误或指导程序逻辑等任务。
The if-else 语句
Section titled “The if-else 语句”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")}The switch 语句
Section titled “The switch 语句”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 为此提供了更高效、更易读的矢量化函数。
The dplyr::case_when() 函数
Section titled “The dplyr::case_when() 函数”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 A2 2 82 B3 3 75 C4 4 68 D5 5 89 B6 6 55 F应该使用哪一个?
Section titled “应该使用哪一个?”以下是选择合适工具的简单指南。
| 语句 | 主要用途 |
|---|---|
if / else if / else | 通用程序控制流。处理单个、非矢量化条件。最适合脚本逻辑、错误处理或函数控制。 |
switch() | 基于单个变量的精确值进行简单分派。适用于路由到不同的函数。 |
dplyr::case_when() | 数据操作的首选方法。 在 mutate() 内部使用,根据多个复杂条件在数据框中创建新列。它具有矢量化、易读性和鲁棒性。 |