自定义函数
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))这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
挑战
中等创建一个名为 mean_score 的自定义函数,用于计算学生考试成绩数据集中每位学生的平均分。
要计算每行的平均分,我们会使用 rowwise() 函数,之后再使用 ungroup() 将所有内容恢复原状。请查看提供的代码。
执行以下操作:
- 创建一个名为
student_mean的新列,用来存放平均分。 - 创建一个名为
is_above_mean的新列,用来存放学生成绩高于或低于平均分的 TRUE 或 FALSE。 - 创建一个名为
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 在线编译器