Tự học R Series: vọc tí về loop functions

Nói tí trải nghiệm về một số loop functions mà H đã vọc qua thấy có một điểm đáng để ý là: vì R là ngôn ngữ thiết kế để làm việc với data nên những built -in functions của nó cũng hướng về việc xử lý data như query, filter, lặp qua một danh sách, gom nhóm theo điều kiện, áp dụng một function lên từng row, column trong danh sách. Do đó với anh em nào đã quen với SQL hoặc với các kiểu query DB có trong các ngôn ngữ cấp cao ví như C# có LINQ, Python có Pandas, …thì việc tiếp cận với R loop functions H nghĩ sẽ rất dễ hiểu.

Bên dưới H sẽ điểm qua một số loop functions mà H đã vọc qua với một số note ngắn gọn. Anh em có thời gian thì đào sâu tìm hiểu thêm nhé 🙂

lapply: loop này sẽ lặp qua một danh sách (list) và áp dụng một action lên từng dòng. Ví dụ bên dưới H có một list số, H sẽ áp dụng action là hàm mean để tính trung bình.

x <- list(a = 1:5, b = rnorm(10))
lapply(x, mean)
## $a
## [1] 3
##
## $b
## [1] 0.4671

Kết quả trả về của lapply là một danh sách list với giá trị là mean của từng thuộc tính. Ví dụ ở trên thuộc tính mean($a) = 3 và mean($b) = 0.4671. Anh em hãy thử với một số action khác như sum, min, max, …xem thế nào nhé.

apply: loop này thường được dùng để áp dụng một action lên từng dòng (row) hoặc cột (column). Action ở đây là một function và thường là dạng anonymous function.

x <- matrix(rnorm(100), 20, 10)
apply(x, 2, mean)
## [1] -0.00930366 -0.01859432  0.21711926  0.02515356  0.45953769 -0.00930366 -0.01859432  0.21711926  0.02515356  0.45953769

Thuộc tính thứ 2 trong loop apply gọi là MARGIN có một trong hai giá trị: 1 là áp dụng lên từng dòng, 2 là áp dụng lên từng cột. Ví dụ ở trên x là một ma trận có 20 dòng và 10 cột. Khi goị hàm apply trên cột nó sẽ cho ra kết quả là một vector với mỗi phần tử là trung bình của mỗi cột.

P/s: anh em có thể xem document cho function trong R bằng cách gõ ?<function>, ví dụ ?apply. Trong R Studio thì nó sẽ show ra bên cửa sổ document nhé (hình dưới)

Có một số shortcut cho hàm apply là: rowSums, rowMeans, colSums, colMeans. Anh em tìm hiểu thêm nhé !

mapply: loop này là loại loop sẽ áp dụng một action lên một tập (set) các tham số truyền vào. Ví dụ chúng ta tạo ra một danh sách có 4 phần tử, với mỗi phần tử là một vector số được lặp đi lặp lại.

list(rep(1, 4), rep(2, 3), rep(3, 2), rep(4, 1))
## [[1]]
## [1] 1 1 1 1
## 
## [[2]]
## [1] 2 2 2
## 
## [[3]]
## [1] 3 3
## 
## [[4]]
## [1] 4
mapply(rep, 1:4, 4:1)

Ví dụ trên có thể áp dụng action repeat (rep) lên từng tham số truyền vào. Với việc viết kiểu mapply, chúng ta sẽ rút ngắn được rất nhiều code nhỉ. 🙂

tapply: được dùng để áp dụng một action lên một tập con của một vector. Ví dụ H có 1 vector x bên dưới và một factor f. Làm sao để tương ứng với mỗi giá trị f chúng ta tính được mean x

x <- c(rnorm(10), runif(10), rnorm(10, 1))
f <- gl(3, 10)
f
## [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
## Levels: 1 2 3
tapply(x, f, mean)
##      1         2         3 
## 0.5174894 0.5120508 1.1599203

tapply rất là tuyệt khi bạn áp dụng trên một dataframe khi muốn tính mean, sum, min, max của một cột phụ thuộc theo một cột khác (cột factor kiểu category).

Ngoài ra còn có một số loop functions khác mà anh em nên tìm hiểu là sapply, vapply (họ nhà *apply), split.

Chúc anh em có những trải nghiệm thật thú vị ! Nếu có thắc mắc gì muốn chia sẻ và góp ý anh em comment bên dưới nhé 🙂

One thought on “Tự học R Series: vọc tí về loop functions

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.