R apply(), lapply(), sapply(), tapply() với Ví dụ
Hướng dẫn này nhằm mục đích giới thiệu bộ sưu tập hàm apply(). Hàm apply() là hàm cơ bản nhất trong tất cả các bộ sưu tập. Chúng ta cũng sẽ học sapply(), lapply() và tapply(). Bộ sưu tập ứng dụng có thể được xem như một sự thay thế cho vòng lặp.
Bộ sưu tập apply() được gói cùng với r cần thiết gói nếu bạn cài đặt R với Anaconda. Hàm áp dụng trong R có thể được cung cấp nhiều hàm để thực hiện ứng dụng dự phòng trên một tập hợp đối tượng (khung dữ liệu, danh sách, vectơ, v.v.). Mục đích của apply() chủ yếu là để tránh việc sử dụng rõ ràng các cấu trúc vòng lặp. Chúng có thể được sử dụng cho danh sách đầu vào, ma trận hoặc mảng và áp dụng một hàm. Bất kỳ chức năng nào cũng có thể được chuyển vào apply().
hàm apply ()
ứng dụng() lấy khung dữ liệu hoặc ma trận làm đầu vào và đưa ra đầu ra dưới dạng vectơ, danh sách hoặc mảng. Áp dụng hàm trong R chủ yếu được sử dụng để tránh việc sử dụng rõ ràng các cấu trúc vòng lặp. Đây là bộ sưu tập cơ bản nhất có thể được sử dụng trên một ma trận.
Hàm này có 3 đối số:
apply(X, MARGIN, FUN) Here: -x: an array or matrix -MARGIN: take a value or range between 1 and 2 to define where to apply the function: -MARGIN=1`: the manipulation is performed on rows -MARGIN=2`: the manipulation is performed on columns -MARGIN=c(1,2)` the manipulation is performed on rows and columns -FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
Ví dụ đơn giản nhất là tính tổng một ma trận trên tất cả các cột. Mã apply(m1, 2, sum) sẽ áp dụng hàm tổng cho ma trận 5×6 và trả về tổng của từng cột có thể truy cập được trong tập dữ liệu.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Đầu ra:
Cách thực hành tốt nhất: Lưu trữ các giá trị trước khi in ra bảng điều khiển.
hàm lapply()
lapply() Hàm rất hữu ích để thực hiện các thao tác trên đối tượng danh sách và trả về đối tượng danh sách có cùng độ dài với tập hợp ban đầu. lappy() trả về một danh sách có độ dài tương tự như đối tượng danh sách đầu vào, mỗi phần tử trong đó là kết quả của việc áp dụng FUN cho phần tử tương ứng của danh sách. Lapply trong R lấy danh sách, vectơ hoặc khung dữ liệu làm đầu vào và đưa ra đầu ra trong danh sách.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l trong lapply() là viết tắt của danh sách. Sự khác biệt giữa lapply() và apply() nằm ở kết quả trả về. Đầu ra của lapply() là một danh sách. lapply() có thể được sử dụng cho các đối tượng khác như khung dữ liệu và danh sách.
hàm lapply() không cần MARGIN.
Một ví dụ rất dễ dàng là thay đổi giá trị chuỗi của ma trận thành chữ thường bằng hàm tower. Chúng tôi xây dựng một ma trận với tên của những bộ phim nổi tiếng. Tên có định dạng chữ hoa.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Đầu ra:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Chúng ta có thể sử dụng unlist() để chuyển đổi danh sách thành một vectơ.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Đầu ra:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
hàm sapply()
vui vẻ() Hàm lấy danh sách, vectơ hoặc khung dữ liệu làm đầu vào và đưa ra đầu ra ở dạng vectơ hoặc ma trận. Nó rất hữu ích cho các thao tác trên các đối tượng danh sách và trả về một đối tượng danh sách có cùng độ dài với tập hợp ban đầu. Hàm saply trong R thực hiện công việc tương tự như hàm lapply() nhưng trả về một vectơ.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Chúng tôi có thể đo tốc độ tối thiểu và khoảng cách dừng của ô tô từ bộ dữ liệu ô tô.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Đầu ra:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Đầu ra:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Đầu ra:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Đầu ra:
## speed dist ## 25 120
Chúng ta có thể sử dụng hàm tích hợp sẵn của người dùng trong lapply() hoặc sapply(). Chúng ta tạo một hàm có tên là avg để tính giá trị trung bình của giá trị nhỏ nhất và lớn nhất của vectơ.
avg <- function(x) { ( min(x) + max(x) ) / 2} fcars <- sapply(dt, avg) fcars
Đầu ra
## speed dist ## 14.5 61.0
Sapply trong R hiệu quả hơn lapply() trong kết quả đầu ra được trả về vì sapply() lưu trữ các giá trị trực tiếp vào một vectơ. Trong ví dụ tiếp theo, chúng ta sẽ thấy điều này không phải lúc nào cũng đúng.
Chúng ta có thể tóm tắt sự khác biệt giữa apply(), sapply() và `lapply() trong bảng sau:
Chức năng | Lập luận | Mục tiêu | Đầu vào | Đầu ra |
---|---|---|---|---|
ứng dụng | áp dụng(x, MARGIN, FUN) | Áp dụng hàm cho hàng hoặc cột hoặc cả hai | Khung dữ liệu hoặc ma trận | vector, danh sách, mảng |
vỗ nhẹ | lapply(X, FUN) | Áp dụng một hàm cho tất cả các phần tử của đầu vào | Danh sách, vectơ hoặc khung dữ liệu | |
vui vẻ | sapply(X, FUN) | Áp dụng một hàm cho tất cả các phần tử của đầu vào | Danh sách, vectơ hoặc khung dữ liệu | vectơ hoặc ma trận |
Vectơ lát
Chúng ta có thể sử dụng lapply() hoặc sapply() có thể hoán đổi cho nhau để cắt khung dữ liệu. Chúng ta tạo một hàm, Below_average(), nhận vào một vectơ các giá trị số và trả về một vectơ chỉ chứa các giá trị hoàn toàn nằm trên mức trung bình. Chúng tôi so sánh cả hai kết quả với hàm() giống hệt nhau.
below_ave <- function(x) { ave <- mean(x) return(x[x > ave]) } dt_s<- sapply(dt, below_ave) dt_l<- lapply(dt, below_ave) identical(dt_s, dt_l)
Đầu ra:
## [1] TRUE
hàm tapply()
tapply() tính toán một thước đo (trung bình, trung vị, tối thiểu, tối đa, v.v.) hoặc một hàm cho từng biến hệ số trong một vectơ. Đây là một hàm rất hữu ích cho phép bạn tạo một tập hợp con của vectơ và sau đó áp dụng một số hàm cho từng tập hợp con đó.
tapply(X, INDEX, FUN = NULL) Arguments: -X: An object, usually a vector -INDEX: A list containing factor -FUN: Function applied to each element of x
Một phần công việc của nhà khoa học hoặc nhà nghiên cứu dữ liệu là tính toán tóm tắt các biến. Ví dụ: đo lường dữ liệu trung bình hoặc nhóm dựa trên một đặc tính. Hầu hết dữ liệu được nhóm theo ID, thành phố, quốc gia, v.v. Tóm tắt nhóm cho thấy nhiều mô hình thú vị hơn.
Để hiểu cách thức hoạt động của nó, hãy sử dụng bộ dữ liệu iris. Bộ dữ liệu này rất nổi tiếng trong thế giới học máy. Mục đích của bộ dữ liệu này là để dự đoán lớp của từng loài trong số ba loài hoa: Sepal, Versicolor, Virginica. Bộ dữ liệu thu thập thông tin về từng loài về chiều dài và chiều rộng của chúng.
Như một công việc trước đây, chúng tôi có thể tính toán độ dài trung bình của mỗi loài. Tapply trong R là một cách nhanh chóng để thực hiện tính toán này.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Đầu ra:
## setosa versicolor virginica ## 3.4 2.8 3.0