Menu
CoddyTech

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.33333

Hà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))
quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

challenge icon

Thử thách

Trung bình

Tạ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:

  1. Tạo cột mới tên là student_mean để lưu điểm trung bình.
  2. 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.
  3. 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ự 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