Rate this post

Bây giờ, đã đến lúc khám phá một trong những khái niệm cơ bản nhất của lập trình R đó là hàm R. Chúng tôi sẽ đề cập đến mọi khía cạnh liên quan đến nó trong hướng dẫn này. Và, tôi đảm bảo với bạn rằng sau khi hoàn thành bài viết này, bạn sẽ không bao giờ vò đầu bứt tai khi sử dụng các hàm R.

Vì vậy, chúng ta hãy bắt đầu hướng dẫn.

Chuyển từ Tập lệnh sang Hàm R

Hàm R cung cấp hai ưu điểm chính so với script:

  • Các hàm có thể hoạt động với bất kỳ đầu vào nào. Bạn có thể cung cấp dữ liệu đầu vào đa dạng cho các chức năng.
  • Đầu ra của hàm là một đối tượng cho phép bạn làm việc với kết quả.

Làm thế nào để tạo một tập lệnh trong R?

Bây giờ chúng ta sẽ tìm hiểu phương pháp tạo script trong R.

Như chúng ta đã biết, R hỗ trợ một số trình soạn thảo. Vì vậy, tập lệnh có thể được tạo trong bất kỳ trình soạn thảo nào như Notepad, MS Word hoặc Word Pad và có thể được lưu với phần mở rộng R trong thư mục làm việc hiện tại.

Bây giờ để đọc tệp trong R, có thể sử dụng hàm nguồn.

Ví dụ: nếu chúng ta muốn đọc script sample.R trong R, chúng ta cần cung cấp lệnh dưới đây:

source("sample.R")

Thao tác này sẽ đọc mẫu tệp trong R.

Để tạo tập lệnh, trước tiên, hãy mở tệp tập lệnh ở chế độ soạn thảo và nhập mã cần thiết.

Chúng tôi sẽ tạo một tập lệnh nhận đầu vào dưới dạng phân số và chuyển nó thành phần trăm bằng cách làm tròn thêm thành một chữ số thập phân.

> frac <- c(0.452, 1.5642, 0.84520)
> percentage <- round(frac * 100, digits = 1)
> out <- paste(percentage, "%", sep = "")
> print(out)

Đó là, bạn cần cung cấp các giá trị mà bạn muốn chuyển đổi thành phần trăm làm đầu vào, sau đó chuyển nó thành phần trăm và làm tròn đến những vị trí cần thiết. Sau đó đặt dấu% và hiển thị câu trả lời.

Lưu tập lệnh trên dưới dạng tệp tập lệnh với bất kỳ tên nào, ví dụ: pastePercent.R.

Bây giờ bạn có thể gọi tập lệnh này trên bảng điều khiển với sự trợ giúp của lệnh source mà chúng ta đã thấy.

source('pastePercent.R')

Chuyển Tập lệnh thành Hàm R

Bây giờ, chúng ta sẽ xem cách chuyển tập lệnh R thành hàm trong R.

Đầu tiên, xác định một hàm với tên để việc gọi một hàm R trở nên dễ dàng hơn và chuyển các đối số cho nó làm đầu vào.

Hàm R phải được theo sau bởi các dấu ngoặc đơn đóng vai trò như một cổng trước cho hàm của bạn và giữa các dấu ngoặc, các đối số cho hàm được cung cấp.

Sử dụng câu lệnh return () hoạt động như một cổng sau của hàm của bạn.

Câu lệnh return () cung cấp kết quả cuối cùng của hàm được trả về không gian làm việc của bạn.

Chúng ta sẽ thấy điều này với một ví dụ bên dưới.

Bây giờ chúng ta hãy xem cách chúng ta có thể chuyển đổi tập lệnh mà chúng ta đã viết trước đó để chuyển đổi các giá trị thành phần trăm và làm tròn thành một hàm R.

Percent_add <- function(frac){
  percent <- round(frac * 100, digits = 1)
  out <- paste(percent, "%", sep = "%")
  return(out)
}

Từ khóa chức năng xác định thời gian bắt đầu của chức năng. Dấu ngoặc đơn sau hàm tạo thành cổng trước hoặc danh sách đối số của hàm. Giữa các dấu ngoặc đơn là các đối số của hàm. Trong trường hợp này, chỉ có một đối số.

Câu lệnh return xác định phần cuối của hàm và trả về kết quả. Đối tượng đặt giữa các dấu ngoặc đơn được trả về từ bên trong hàm vào vùng làm việc. Chỉ một đối tượng có thể được đặt giữa các dấu ngoặc đơn.

Các dấu ngoặc nhọn, {} là các thành của hàm. Tất cả mọi thứ giữa các mắc cài là một phần của dây chuyền lắp ráp hoặc phần thân của hàm. Đây là cách các hàm được tạo trong R.

Khám phá các đối số khác nhau trong lập trình R

Sử dụng hàm R

Sau khi chuyển đổi script thành một hàm R, bạn cần lưu nó và bạn có thể sử dụng lại hàm trong R nếu cần.

Vì R không cho bạn biết rằng nó đã tải hàm nhưng nó hiện diện trong vùng làm việc, nếu bạn muốn, bạn có thể kiểm tra nó bằng cách sử dụng lệnh ls () .

Bây giờ chúng ta đã biết tất cả các hàm trong R đều có trong bộ nhớ và chúng ta có thể sử dụng nó khi được yêu cầu.

Ví dụ: nếu bạn muốn tạo lại tỷ lệ phần trăm từ các giá trị, bạn có thể sử dụng hàm thêm phần trăm cho tương tự như bên dưới:

ls()
new.vector <- c(0.8223, 0.02487, 1.62, 0.4)
Percent_add(new.vector)

Sử dụng các đối tượng hàm trong R

Trong R, một hàm cũng là một đối tượng và bạn có thể thao tác nó như cách bạn làm với các đối tượng khác.

Bạn có thể gán một hàm cho đối tượng mới bằng lệnh dưới đây:

percent_paste <- Percent_add

Bây giờ phần trăm_paste  cũng là một chức năng hoạt động chính xác như Percent_add. Lưu ý rằng, bạn không thêm nó sau dấu ngoặc đơnPercent_add trong trường hợp này. Nếu bạn thêm dấu ngoặc đơn, bạn sẽ gọi hàm và đặt kết quả của lệnh gọi đó trong phần trăm_paste. Nếu bạn không thêm dấu ngoặc đơn, bạn tham chiếu đến chính đối tượng hàm mà không cần gọi nó.

percent_paste

Percent_add <- function(frac){
  percentage <- round(frac * 100, digits = 1)
  out <- paste(percentage, "%", sep = "")
  return(out)
}

print(Percent_add(new.vector))

Hiển thị mã:

Đầu ra của đoạn mã trên như sau:

Giảm số dòng trong R

Như bây giờ, chúng ta đã thấy cách chuyển đổi script thành một hàm và cách gán một hàm cho đối tượng mới. Tất cả những điều này bao gồm một số lượng lớn các dòng được viết.

Vì vậy, bây giờ chúng ta hãy hiểu cách chúng ta có thể giảm số dòng trong R.

Về cơ bản có hai cách để làm điều đó:

  • Trả lại giá trị theo mặc định
  • Rơi {}

Hãy cùng chúng tôi xem chi tiết các cách trên dưới đây:

Trả lại giá trị theo mặc định trong R

Cho đến bây giờ, trong tất cả các đoạn mã trên, chúng ta đã viết hàm return () để trả về kết quả đầu ra. Nhưng trong R, điều này có thể được bỏ qua vì theo mặc định, R trả về giá trị của dòng mã cuối cùng trong thân hàm R.

Bây giờ, đoạn mã trên sẽ là:

Percent_add <- function(fac){ 
percentage <- round(fac * 100, digits = 1) 
paste(percentage, "%", sep = "")}

Bạn cần trả về nếu bạn muốn thoát khỏi hàm trước khi kết thúc mã trong nội dung.

Ví dụ: bạn có thể thêm một dòng vào hàm Percent_add để kiểm tra xem fac có phải là số hay không, và nếu không, trả về NULL, như được hiển thị trong bảng sau:

Percent_add <- function(frac){
if( !is.numeric(frac) ) return(NULL) 
percentage <- round(frac * 100, digits = 1) 
paste(percentage, "%", sep = "")}

Bỏ dấu {}

Bạn có thể bị tụt mắc cài trong một số trường hợp mặc dù chúng tạo thành một bức tường ngăn cách xung quanh hàm.

Nếu một hàm chỉ bao gồm một dòng mã, bạn chỉ có thể thêm dòng đó vào sau danh sách đối số mà không cần đặt nó trong dấu ngoặc nhọn. R sẽ xem đoạn mã sau danh sách đối số là phần thân của hàm.

Giả sử, bạn muốn tính toán tỷ lệ cược từ một tỷ lệ. Bạn có thể viết một hàm mà không cần sử dụng dấu ngoặc nhọn, như hình dưới đây:

> odds <- function(x) x / (1-x)

Ở đây không có dấu ngoặc nhọn nào được sử dụng để viết hàm.

Phạm vi của chức năng R

Mọi đối tượng bạn tạo ra đều nằm trong môi trường này, còn được gọi là môi trường toàn cục. Không gian làm việc hoặc môi trường toàn cầu là vũ trụ của người dùng R, nơi mọi thứ diễn ra.

Có hai loại hàm R như được giải thích bên dưới:

Chức năng R external

Nếu bạn sử dụng một hàm R, trước tiên hàm này sẽ tạo ra một môi trường cục bộ tạm thời. Môi trường cục bộ này được lồng trong môi trường toàn cục, có nghĩa là từ môi trường cục bộ đó, bạn cũng có thể truy cập bất kỳ đối tượng nào từ môi trường toàn cục. Ngay sau khi chức năng kết thúc, môi trường cục bộ bị phá hủy cùng với tất cả các đối tượng trong đó.

Nếu R thấy bất kỳ tên đối tượng nào, trước tiên nó sẽ tìm kiếm môi trường cục bộ. Nếu nó tìm thấy đối tượng ở đó, nó sẽ sử dụng đối tượng khác mà nó tìm kiếm trong môi trường chung cho đối tượng đó.

Chức năng R internal

Sử dụng các biến toàn cục trong một hàm R không được coi là một phương pháp hay. Viết các hàm của bạn theo cách mà chúng cần các đối tượng trong môi trường toàn cục là không hiệu quả vì ngay từ đầu, bạn sử dụng các hàm để tránh sự phụ thuộc vào các đối tượng trong môi trường toàn cục.

Toàn bộ khái niệm đằng sau R phản đối mạnh mẽ việc sử dụng các biến toàn cục được sử dụng trong các hàm khác nhau. Là một ngôn ngữ lập trình hàm, một trong những ý tưởng chính của R là kết quả của một hàm không được phụ thuộc vào bất cứ thứ gì ngoài các giá trị cho các đối số của hàm đó. Nếu bạn đưa ra các đối số cho các giá trị giống nhau, bạn sẽ luôn nhận được cùng một kết quả.

Đặc điểm này của R có thể khiến bạn thấy kỳ quặc, nhưng nó có giá trị của nó. Đôi khi bạn cần lặp lại một số phép tính một vài lần trong một hàm, nhưng những phép tính này chỉ có ý nghĩa bên trong hàm đó.

Ví dụ dưới đây cho thấy việc sử dụng chức năng nội bộ:

calculate_func <- function(data1, data2, data3){
  base_min <- function(z) z - mean(data3)
  base_min(data1) / base_min(data2)
}

Đầu ra:

Mã cho hàm tính toán.eff được hiển thị bên dưới:

> d1 <- c(3.24, 2.21, 1.45)
> d2 <- c(4.65, 5.12, 4.23)
> d3 <- c(0.11, 0.20, 0.49, 0.28)
> calculate_func(d1,d2,d3)

Đầu ra:

Xem xét kỹ hơn định nghĩa hàm R của base_min () cho thấy rằng nó sử dụng một điều khiển đối tượng nhưng không có đối số với tên đó.

Tìm các phương thức đằng sau hàm

Thật dễ dàng để tìm ra hàm bạn đã sử dụng trong R. Bạn có thể chỉ cần xem mã hàm của print () bằng cách gõ tên của nó vào dòng lệnh.

Để hiển thị mã thông tin của hàm print (), chúng ta tiến hành như sau:

print

Đầu ra:

Hàm UseMethod ()

Làm thế nào mà một dòng mã trong hàm print () lại có thể thực hiện nhiều việc phức tạp, chẳng hạn như in vectơ, khung dữ liệu và danh sách, tất cả theo một cách khác? Hàm UseMethod () chứa câu trả lời. Câu trả lời này đóng vai trò là một chức năng trung tâm trong hệ thống chức năng chung chính.

Hàm UseMethod () di chuyển theo và tìm kiếm một hàm có thể xử lý loại đối tượng được cung cấp dưới dạng đối số x.

Giả sử bạn có một khung dữ liệu mà bạn muốn in. Đối tượng được truyền dưới dạng đối số sẽ được in bằng cách sử dụng hàm print.data.frame () sẽ được R tra cứu đầu tiên.

Các chức năng khác được tìm kiếm thông qua việc tìm kiếm kỹ lưỡng một chức năng khác. Sau đó, thủ tục được bắt đầu với một bản in, sau đó được theo sau bởi loại đối tượng và dấu chấm.

Hàm print.data.frame () cũng có thể được gọi bên trong mã. Điều này được giải thích trong phần tới.

Gọi các chức năng bên trong mã

Bạn cũng có thể tự gọi hàm print.data.frame ().

Dưới đây là ví dụ tương tự:

> small_data <- data.frame(c1 = 1:2, c2 = 2:1)
> print.data.frame(small_data)

Sử dụng các phương thức mặc định trong R

R cung cấp các tính năng để tạo ra một đối tượng với những cái tên đó đã được sử dụng bởi R . Nó có thể với việc sử dụng từ khóa mặc định.

R sẽ bỏ qua kiểu của đối tượng trong trường hợp đó và chỉ tìm một phương thức mặc định nếu bạn sử dụng từ khóa mặc định với tên của một đối tượng.

Ví dụ dưới đây giải thích điều đó:

> print.default(small_data)

Đầu ra:

Các Function Cơ Bản trong R

Trong R, có một loạt các function cơ bản được sử dụng rộng rãi trong các tác vụ toán học và thao tác dữ liệu, cũng như xử lý chuỗi và thời gian. Dưới đây là một số ví dụ minh họa cho mỗi loại function.

Các Function Toán Học

# Tính tổng của các phần tử
sum(1, 2, 3, 4) # Trả về 10

# Tính giá trị trung bình
mean(c(1, 2, 3, 4)) # Trả về 2.5

# Tính giá trị trung vị
median(c(1, 2, 3, 4, 5)) # Trả về 3

# Tính độ lệch chuẩn
sd(c(1, 2, 3, 4)) # Trả về một giá trị phản ánh sự phân tán của dữ liệu

Các Function Thao Tác Dữ Liệu

# Hiển thị cấu trúc của đối tượng dữ liệu
str(mtcars) # Cung cấp một tóm tắt cấu trúc của bộ dữ liệu mtcars

# Xem các hàng đầu tiên/cuối cùng của dữ liệu
head(mtcars, 3) # Hiển thị 3 hàng đầu tiên của mtcars
tail(mtcars, 3) # Hiển thị 3 hàng cuối cùng của mtcars

# Tạo một tập con của dữ liệu dựa trên điều kiện
subset(mtcars, cyl == 4) # Tạo một tập con của mtcars với xe có 4 xi lanh

# Kết hợp các bảng dữ liệu
merge(df1, df2, by="id") # Kết hợp df1 và df2 dựa trên cột id

Các Function Xử Lý Chuỗi

# Nối các chuỗi
paste("Hello", "World", sep = " ") # Trả về "Hello World"
paste0("Hello", "World") # Trả về "HelloWorld"

# Thay thế một phần của chuỗi bằng một chuỗi khác
gsub("is", "was", "This is it") # Trả về "Thwas was it"

Các Function Xử Lý Thời Gian và Ngày Tháng

# Lấy ngày hiện tại
Sys.Date() # Trả về ngày hiện tại

# Chuyển đổi chuỗi sang định dạng ngày tháng
as.Date("1970-01-01") # Trả về đối tượng ngày

# Tính toán sự khác biệt giữa hai thời điểm
difftime(Sys.Date(), as.Date("2020-01-01")) # Tính số ngày từ ngày 1 tháng 1 năm 2020 đến nay

Những function này chỉ là phần nổi của tảng băng chìm trong thế giới R, nơi mỗi function mở ra khả năng xử lý và phân tích dữ liệu một cách mạnh mẽ và linh hoạt.

Các Function Nâng Cao

R cung cấp các function nâng cao giúp thao tác và phân tích dữ liệu một cách hiệu quả, xử lý lượng lớn dữ liệu thông qua việc áp dụng hàm trên các phần dữ liệu khác nhau, tóm tắt dữ liệu theo nhóm, và chuyển đổi hình dạng của dữ liệu để phân tích trở nên linh hoạt hơn.

apply(), lapply(), sapply(), tapply()

Các function này áp dụng một hàm cho các phần của dữ liệu:

# Áp dụng một hàm lên hàng hoặc cột của ma trận
apply(m, 1, sum) # áp dụng hàm sum lên mỗi hàng của ma trận m

# Áp dụng một hàm lên từng phần tử của danh sách
lapply(list, function(x) x^2) # trả về bình phương của mỗi phần tử trong danh sách

# Tương tự lapply nhưng cố gắng đơn giản hóa kết quả
sapply(list, sum) # tính tổng của mỗi phần tử (nếu chúng là vectơ)

# Áp dụng một hàm lên từng nhóm dữ liệu
tapply(data$value, data$category, sum) # tính tổng giá trị theo từng loại category

aggregate()

Tóm tắt dữ liệu theo nhóm, cho phép tính toán các thống kê tổng hợp:

aggregate(data$value, by=list(data$category), FUN=mean) # tính giá trị trung bình của value cho mỗi nhóm category

reshape(), melt(), cast()

Chuyển đổi dữ liệu từ dạng “rộng” sang “dài” và ngược lại, tạo dữ liệu dễ phân tích:

# Chuyển đổi dữ liệu từ dạng "rộng" sang "dài"
melt(data) # làm mềm dữ liệu từ dạng rộng sang dạng dài

# Tái cấu trúc dữ liệu theo một khuôn mẫu mới
dcast(data, formula) # tái cấu trúc dữ liệu theo formula, hỗ trợ tạo dữ liệu dạng rộng hoặc dạng dài

Những công cụ nâng cao này giúp mở rộng khả năng của người dùng trong việc xử lý và phân tích dữ liệu, từ việc tối ưu hóa quy trình làm việc đến việc khám phá và trích xuất thông tin chi tiết từ dữ liệu.

Làm Việc Với Dữ Liệu Bảng (DataFrame) và Danh Sách (List)

Trong R, data.framelist là hai cấu trúc dữ liệu cơ bản nhưng mạnh mẽ, hỗ trợ phân tích dữ liệu đa dạng và phức tạp. Một data.frame giống như một bảng trong cơ sở dữ liệu, nơi mỗi cột có thể chứa dữ liệu của một loại khác nhau (numeric, character, factor, etc.), và mỗi hàng đại diện cho một quan sát hoặc một bản ghi. Trong khi đó, list có thể chứa một loạt các loại đối tượng trong R, kể cả các data.frame, vectơ, hoặc thậm chí là các list khác, làm cho nó trở thành một công cụ linh hoạt để quản lý dữ liệu phức tạp.

Cách sử dụng rbind(), cbind() để kết hợp các data.frame

  • rbind(): Được sử dụng để ghép các data.frame theo hàng, nghĩa là thêm các quan sát mới vào dưới cùng của data.frame. Điều kiện tiên quyết là tất cả các data.frame cần phải có cùng số lượng và tên cột.
df1 <- data.frame(Name = c("Alice", "Bob"), Age = c(24, 25))
df2 <- data.frame(Name = c("Charlie", "David"), Age = c(23, 22))
combined_df_by_row <- rbind(df1, df2)
  • cbind(): Dùng để ghép các data.frame theo cột, tức là thêm các biến mới vào data.frame hiện tại. Tất cả các data.frame cần phải có cùng số lượng hàng.
df3 <- data.frame(Height = c(165, 170, 175, 180))
combined_df_by_col <- cbind(combined_df_by_row, df3)

Sử dụng split() để chia dữ liệu theo nhóm

Function split() chia một vectơ, data.frame, hoặc list thành các nhóm dựa trên một hoặc nhiều nhóm chỉ mục, giúp quản lý và phân tích dữ liệu theo nhóm trở nên thuận tiện hơn.

data <- data.frame(
  Name = c("Alice", "Bob", "Charlie", "David"),
  Age = c(24, 25, 23, 22),
  Group = c("A", "B", "A", "B")
)
split_data <- split(data, data$Group)

Trong ví dụ trên, split_data sẽ là một list, với mỗi phần tử chứa dữ liệu tương ứng với một nhóm Group. Việc sử dụng split() như vậy cho phép phân tích độc lập dữ liệu cho từng nhóm một cách hiệu quả và dễ dàng.

Những công cụ này làm cho việc xử lý và phân tích dữ liệu trong R trở nên mạnh mẽ, cho phép các nhà phân tích dễ dàng thao tác với dữ liệu và đạt được kết quả mong muốn.

Kết luận sử dụng các hàm R

Chúng tôi đã thảo luận về các phương pháp khác nhau để sử dụng các hàm R. Ngoài ra, chúng ta đã tìm hiểu về cách giảm số dòng cùng với các phương thức mặc định trong R. Cuối cùng, chúng ta đã khám phá phạm vi của hàm R.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now