Menu
CoddyTech

自定义函数

Coddy R 中的数据处理 课程的第 14 课,共 14 课。

R 中的自定义函数是强大的工具,可用于创建可重复使用的代码并执行复杂的数据转换。它们可以将一系列操作封装成一个可调用的单元。让我们来了解如何创建和使用自定义函数来处理数据。

自定义函数的基本结构

在 R 中创建自定义函数的基本语法如下:

function_name <- function(arg1, arg2, ...) {
  # 函数体
  # 使用 arg1、arg2 等参数进行操作。
  return(result)
}

创建一个简单的自定义函数

让我们创建一个简单的函数,用来计算向量中缺失值的百分比:

percent_missing <- function(x) {
  sum(is.na(x)) / length(x) * 100
}

# 用法
data <- c(1, 2, NA, 4, NA, 6)
percent_missing(data)  # 返回:33.33333

使用多个参数的函数

自定义函数可以接收多个参数,从而执行更灵活的操作:

scale_column <- function(df, column_name, min_val = 0, max_val = 1) {
  df[[column_name]] <- (df[[column_name]] - min(df[[column_name]], na.rm = TRUE)) / 
                       (max(df[[column_name]], na.rm = TRUE) - min(df[[column_name]], na.rm = TRUE))
  df[[column_name]] <- df[[column_name]] * (max_val - min_val) + min_val
  return(df)
}

# 用法
df <- data.frame(x = 1:10, y = 11:20)
scaled_df <- scale_column(df, "x", 0, 100)

返回多个值

函数可以使用列表返回多个值:

summarize_numeric <- function(x) {
  list(
    mean = mean(x, na.rm = TRUE),
    median = median(x, na.rm = TRUE),
    sd = sd(x, na.rm = TRUE)
  )
}

# 用法
numbers <- c(1, 2, 3, 4, 5)
summary_stats <- summarize_numeric(numbers)

将自定义函数与 dplyr 一起使用

将自定义函数与 dplyr 结合使用时,它们在数据处理方面尤其有用:

library(dplyr)

categorize_age <- function(age) {
  case_when(
    age < 18 ~ "Child",
    age < 65 ~ "Adult",
    TRUE ~ "Senior"
  )
}

# 在 dplyr 中的用法
df <- data.frame(name = c("Alice", "Bob", "Charlie"), age = c(25, 72, 16))
df %>%
  mutate(age_category = categorize_age(age))
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

challenge icon

挑战

中等

创建一个名为 mean_score 的自定义函数,用于计算学生考试成绩数据集中每位学生的平均分。

要计算每行的平均分,我们会使用 rowwise() 函数,之后再使用 ungroup() 将所有内容恢复原状。请查看提供的代码。

执行以下操作:

  1. 创建一个名为 student_mean 的新列,用来存放平均分。
  2. 创建一个名为 is_above_mean 的新列,用来存放学生成绩高于或低于平均分的 TRUE 或 FALSE。
  3. 创建一个名为 rank 的列,用来存放每位学生根据平均分相对于其他学生的排名。例如,1 表示该学生成绩最好,2 表示该学生成绩排名第二,以此类推。
    • 使用 order() 查找排名:order(order(mean_col, decreasing = TRUE))

亲手试试

# 读取输入
con <- file("stdin", "r")
input_data <- readLines(con)
close(con)

# 将输入数据处理成数据框
data <- read.csv(text = input_data, header = TRUE, stringsAsFactors = FALSE)

# 定义 mean_score 函数
mean_score <- function(data) {
  # TODO: 在这里编写你的代码
  # 计算所有科目的平均分

  return(result)
}

# TODOL 在这里编写你的代码
# 新建一列 student_mean,存储平均分。
# 新建一列 is_above_mean,根据学生的分数高于还是低于平均分,存储 TRUE 或 FALSE。
# 新建一列 rank,根据平均分记录每位学生相对于其他学生的排名。例如,1 表示第一名,2 表示第二名,以此类推。

# 输出结果
print(data)

R 中的数据处理中的所有课

自己练习: R 在线编译器