Hàm tùy chỉnh
Bài học 14 trên 14 trong khóa học Thao tác dữ liệu trong R của Coddy.
Các hàm tùy chỉnh (function) trong R là công cụ mạnh mẽ để tạo đoạn code có thể tái sử dụng và thực hiện các phép biến đổi dữ liệu phức tạp. Chúng cho phép bạn gói gọn một loạt thao tác thành một đơn vị có thể gọi. Hãy cùng tìm hiểu cách tạo và sử dụng hàm tùy chỉnh để thao tác dữ liệu.
Cấu trúc cơ bản của hàm tùy chỉnh
Cú pháp cơ bản để tạo hàm tùy chỉnh trong R là:
function_name <- function(arg1, arg2, ...) {
# Thân hàm
# Các phép toán sử dụng arg1, arg2, v.v.
return(result)
}Tạo hàm tùy chỉnh đơn giản
Hãy tạo một hàm đơn giản để tính tỷ lệ phần trăm giá trị bị thiếu trong một véc-tơ:
percent_missing <- function(x) {
sum(is.na(x)) / length(x) * 100
}
# Cách sử dụng
data <- c(1, 2, NA, 4, NA, 6)
percent_missing(data) # Trả về: 33.33333Hàm có nhiều đối số
Hàm tùy chỉnh có thể nhận nhiều đối số, cho phép thực hiện các thao tác linh hoạt hơn:
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)
}
# Cách sử dụng
df <- data.frame(x = 1:10, y = 11:20)
scaled_df <- scale_column(df, "x", 0, 100)Trả về nhiều giá trị
Hàm có thể trả về nhiều giá trị bằng cách sử dụng danh sách:
summarize_numeric <- function(x) {
list(
mean = mean(x, na.rm = TRUE),
median = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE)
)
}
# Cách sử dụng
numbers <- c(1, 2, 3, 4, 5)
summary_stats <- summarize_numeric(numbers)Sử dụng hàm tùy chỉnh với dplyr
Hàm tùy chỉnh có thể đặc biệt hữu ích khi kết hợp với dplyr để thao tác dữ liệu:
library(dplyr)
categorize_age <- function(age) {
case_when(
age < 18 ~ "Child",
age < 65 ~ "Adult",
TRUE ~ "Senior"
)
}
# Cách sử dụng với dplyr
df <- data.frame(name = c("Alice", "Bob", "Charlie"), age = c(25, 72, 16))
df %>%
mutate(age_category = categorize_age(age))Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Thử thách
Trung bìnhTạo một hàm tùy chỉnh tên là mean_score để tính điểm trung bình của mỗi học sinh trong bộ dữ liệu điểm thi.
Để tính điểm trung bình trên từng hàng, ta sẽ dùng hàm rowwise(), sau đó dùng ungroup() để đưa mọi thứ về trạng thái ban đầu. Hãy xem code được cung cấp.
Thực hiện các thao tác sau:
- Tạo cột mới tên là
student_meanđể lưu điểm trung bình. - Tạo cột mới tên là
is_above_meanđể lưu TRUE hoặc FALSE, cho biết học sinh có điểm trung bình cao hơn hay thấp hơn mức trung bình. - Tạo cột tên là
rankđể lưu thứ hạng của mỗi học sinh so với những học sinh khác dựa trên điểm trung bình. Ví dụ, 1 nghĩa là học sinh đứng đầu, 2 nghĩa là học sinh đứng thứ hai, v.v.- Để tìm thứ hạng, hãy dùng
order():order(order(mean_col, decreasing = TRUE))
- Để tìm thứ hạng, hãy dùng
Tự làm thử
# Đọc dữ liệu đầu vào
con <- file("stdin", "r")
input_data <- readLines(con)
close(con)
# Chuyển dữ liệu đầu vào thành khung dữ liệu
data <- read.csv(text = input_data, header = TRUE, stringsAsFactors = FALSE)
# Định nghĩa hàm (function) mean_score
mean_score <- function(data) {
# TODO: Viết code của bạn ở đây
# Tính điểm trung bình của tất cả các môn học
return(result)
}
# TODOL Viết code của bạn ở đây
# Tạo cột mới tên student_mean để lưu điểm trung bình.
# Tạo cột mới tên is_above_mean để lưu TRUE hoặc FALSE tùy theo điểm của học sinh cao hơn hay thấp hơn mức trung bình.
# Tạo cột tên rank để lưu thứ hạng của mỗi học sinh so với các học sinh khác dựa trên điểm trung bình. Ví dụ, 1 nghĩa là học sinh đứng đầu, 2 nghĩa là học sinh đứng thứ hai, v.v.
# In kết quả
print(data)
Tất cả bài học trong Thao tác dữ liệu trong R
Tự luyện tập: Trình biên dịch R online