Chuyển đến nội dung chính

Hướng dẫn về Họ hàm Apply trong R

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng các hàm apply trong R, các biến thể của chúng và một vài hàm liên quan áp dụng cho các cấu trúc dữ liệu khác nhau.
Đã cập nhật 5 thg 10, 2026  · 14 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

biểu ngữ học R

Một ghi chú về Họ hàm Apply trong R

Họ hàm Apply trong R là tập các hàm cho phép bạn áp dụng một hàm lên các phần tử của vector, list hoặc matrix. Tuy nhiên, đây được xem là tính năng cũ và không nên dùng cho mã mới. Thay vào đó, khuyến nghị sử dụng gói purrr cho mọi thao tác lặp trong R. purrr cung cấp cú pháp thống nhất để làm việc với các hàm có nhiều đầu vào và đầu ra, giúp việc viết và đọc mã dễ dàng hơn. Ngoài ra, purrr còn có nhiều hàm được tối ưu cho môi trường tính toán hiện đại, nhanh và hiệu quả hơn so với họ Apply. Nhìn chung, dù họ Apply vẫn có thể hoạt động với một số trường hợp, nhưng tốt nhất bạn nên dùng purrr cho mọi dự án R mới.

Các hàm Apply như lựa chọn thay thế cho vòng lặp

Bài viết này sẽ hướng dẫn cách bạn có thể dùng hàm R apply(), các biến thể như mapply()  và một vài họ hàng của apply(), áp dụng lên các cấu trúc dữ liệu khác nhau. Dĩ nhiên không thể bàn hết mọi biến thể, nhưng khi có thể, bạn sẽ được giới thiệu cách dùng các hàm này phối hợp với nhau qua vài ví dụ hơi “nặng ký” hơn.

Bạn cũng có thể thấy hữu ích khi xem qua khóa nhập môn R để hiểu rõ hơn về list, vector, array và dataframe, dù bạn không nhất thiết phải hoàn thành hướng dẫn đó để theo dõi bài viết này!

Họ apply()

Họ apply() thuộc gói base của R và bao gồm các hàm để thao tác các lát cắt dữ liệu từ matrix, array, list và dataframe theo cách lặp lại. Những hàm này cho phép “đi qua” dữ liệu theo nhiều cách và tránh phải dùng cấu trúc vòng lặp tường minh. Chúng nhận vào một list, matrix hoặc array và áp dụng một hàm đã đặt tên kèm theo một hoặc vài đối số tùy chọn.

Hàm được gọi có thể là:

  • Một hàm gộp, như mean hoặc sum (trả về một số hay vô hướng);
  • Các hàm biến đổi hoặc trích chọn khác; và
  • Các hàm vector hóa khác, cho ra cấu trúc phức tạp hơn như list, vector, matrix và array.

Các hàm apply() là nền tảng cho các kết hợp phức tạp hơn và giúp thực hiện thao tác chỉ với rất ít dòng mã. Cụ thể hơn, họ này gồm các hàm apply(), lapply() , sapply(), vapply(), mapply(), rapply() và tapply().

Vậy dùng như thế nào và khi nào?

Điều này phụ thuộc vào cấu trúc dữ liệu bạn muốn thao tác và định dạng đầu ra bạn cần.

Cách dùng apply() trong R

Hãy bắt đầu với “bố già” của họ, apply(), hoạt động trên array. Để đơn giản, hướng dẫn này chỉ xét array 2 chiều, còn gọi là matrix.

Tài liệu base R cho biết cách gọi như sau: apply(X, MARGIN, FUN, ...)

trong đó:

  • X là một array hoặc matrix nếu array có số chiều là 2;
  • MARGIN là biến xác định cách áp dụng hàm: khi MARGIN=1 là theo hàng, còn MARGIN=2 là theo cột. Lưu ý khi dùng MARGIN=c(1,2) thì áp dụng cho cả hàng và cột; và
  • FUN là hàm bạn muốn áp dụng lên dữ liệu. Có thể là bất kỳ hàm R nào, kể cả hàm do người dùng định nghĩa (UDF).

Người mới có thể khó hình dung chuyện gì đang diễn ra, nên một hình minh họa và ít mã sẽ hữu ích.

Hãy tạo một matrix 5 x 6 và giả sử bạn muốn tính tổng các giá trị của từng cột.

Bạn có thể viết như sau:

# Construct a 5 x 6 matrix
my_matrix <- matrix(1:30, nrow = 5, ncol = 6)

# Calculate the sum of each column
col_sums <- apply(my_matrix, 2, sum)

# Print the result
print(col_sums)

Hàm matrix() tạo một matrix 5 x 6 với các giá trị từ 1 đến 30. Sau đó ta dùng hàm apply() để áp dụng hàm sum() lên từng cột của matrix (2 chỉ định áp dụng theo cột). Vector kết quả chứa tổng theo cột được lưu trong biến col_sums và in ra console.

Hãy nhớ trong R, một matrix có thể được xem là tập các vector hàng khi bạn đi từ trên xuống (theo chiều dọc 1, tức margin 1), hoặc là danh sách các vector cột khi bạn đi từ trái sang phải theo margin 2.

Nghĩa là câu lệnh bạn vừa nhập, như minh họa ở hình 1, có thể diễn đạt là: “áp dụng hàm ‘sum’ lên matrix X theo margin 2 (theo cột), cộng các giá trị của từng cột”.

Lưu ý để tránh rối hình, chỉ một cột được tô đậm.

Bạn thu được một vector hàng chứa tổng giá trị của mỗi cột.

Đầu ra ở trên, một vector hàng, cũng sẽ có được nếu bạn cộng theo từng hàng của matrix. Đây là cách R hiển thị kết quả.

Một lưu ý cho phần sau: trong đa số trường hợp, R có thể trả về một giá trị ngay cả khi bạn không chỉ định, hay nói chính xác hơn là không gán giá trị trả về của hàm cho biến nào. R đơn giản trả về đối tượng được đánh giá cuối cùng. Tuy nhiên, khi bạn muốn kiểm tra giá trị trả về hoặc cần thực hiện các thao tác tiếp theo lên chúng, tốt nhất là gán tường minh kết quả của hàm vào một biến.

Hàm lapply()

Bạn muốn áp dụng một hàm cho từng phần tử của một list và nhận về một list. Khi chạy ?lapply, bạn sẽ thấy cú pháp giống với apply().

Điểm khác là:

  1. Có thể dùng cho các đối tượng khác như dataframe, list hoặc vector; và
  2. Đầu ra là một list (chữ “l” trong tên hàm), có số phần tử bằng với đối tượng đầu vào.

Để xem hoạt động thế nào, hãy tạo vài matrix và trích từ mỗi matrix một cột nhất định.

Đây là thao tác khá phổ biến trên dữ liệu thực khi so sánh hoặc gộp từ các dataframe khác nhau.

Ví dụ minh họa trong hình 2 có thể mã hóa như sau:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

hàm lapply vs apply

Thao tác được minh họa ở phần bên trái của hình 2.

Một lần nữa, bạn bắt đầu bằng cách chỉ định đối tượng quan tâm, list Mylist. Bạn dùng toán tử chọn tiêu chuẩn của R là [ và bỏ trống tham số đầu (tương đương “bất kỳ”, nên bạn thấy hai dấu phẩy).

Tiếp theo, bạn chỉ định tham số thứ hai là 2: margin của chúng ta là ‘cột’. Vậy là bạn trích cột thứ hai từ tất cả các matrix trong list.

Một vài lưu ý về đoạn mã trên:

  • Ký hiệu [ là toán tử chọn. Nhớ rằng, ví dụ, để trích tất cả phần tử ở hàng thứ ba của B cần: B[3,];
  • Ký hiệu [[ ]] biểu thị bạn đang làm việc với list: [[2]] nghĩa là phần tử thứ hai của list. Điều này cũng thể hiện ở đầu ra R trả về;
  • Đầu ra là một list có số phần tử bằng với đầu vào; và
  • Lưu ý bạn cũng có thể trích một phần tử đơn từ mỗi matrix như sau: lapply(MyList,"[", 1, 2)

Bên phải hình 2 là một cách trích khác: lần này bạn bỏ trống tham số đầu và lấy hàng đầu tiên từ mỗi matrix.

Hãy tự thử nhé! Chọn cột thứ hai từ mỗi matrix trong list:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

Hàm sapply()

Hàm sapply() hoạt động như lapply(), nhưng cố gắng đơn giản hóa đầu ra về cấu trúc dữ liệu cơ bản nhất có thể. Thực ra, sapply() là một hàm “bao” (wrapper) cho lapply().

Một ví dụ sẽ giúp dễ hiểu hơn: giả sử bạn muốn lặp lại thao tác trích một phần tử như ví dụ trước, nhưng giờ lấy phần tử đầu của hàng thứ hai (chỉ số 2 và 1) cho mỗi matrix.

Dùng lapply() sẽ trả về một list, trừ khi bạn truyền simplify=FALSE làm tham số cho sapply(). Khi đó, một list sẽ được trả về. Xem cách hoạt động trong đoạn mã dưới đây:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PSAyKVxudGVzdF9mdW5jdGlvbihcInVubGlzdFwiLCBcInhcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Ngược lại, một hàm như unlist() có thể bảo lappy() trả về một vector!

Dù sao, để tránh nhầm lẫn, tốt nhất nên dùng những hàm này theo “định dạng gốc” của chúng và tránh chuyển đổi trừ khi thật cần thiết.

Hàm rep()

Một thứ thường dùng cùng với các hàm apply() là rep(). Khi áp dụng lên một vector hoặc factor x, hàm này nhân bản các giá trị của nó một số lần được chỉ định.

Hãy dùng một trong các vector mà bạn đã tạo ở trên bằng lapply() trong MyList.

Lần này, bạn chỉ chọn phần tử ở hàng đầu và cột đầu từ mỗi phần tử của list MyList (và dùng sapply() để lấy một vector):

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9

Bạn thấy đoạn mã trên lặp lại các giá trị của Z một số lần như c(3,1,2) quy định: ba lần phần tử thứ nhất, một lần phần tử thứ hai và hai lần phần tử thứ ba:

Tiện lợi chứ?

Hàm mapply()

Hàm mapply() là viết tắt của ‘multivariate’ apply. Mục đích là vector hóa các đối số cho một hàm vốn dĩ không chấp nhận vector làm đối số.

Nói ngắn gọn, mapply() áp dụng một hàm cho nhiều đối số dạng List hoặc nhiều Vector.

Hãy xem một ví dụ mapply() nơi bạn tạo một matrix 4 x 4 bằng cách gọi lặp hàm rep():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==

Nhưng bạn sẽ thấy có cách hiệu quả hơn để “ghép” kết quả của hàm rep() thay vì dùng c(): khi gọi mapply(), bạn vector hóa hành động của hàm rep().

Hàm aggregate()

Hàm này nằm trong gói stats, bạn dùng như sau: aggregate(x, by, FUN, ..., simplify = TRUE).

Nói cách khác, nó hoạt động tương tự apply(): bạn chỉ định đối tượng, hàm và cho biết có muốn đơn giản hóa hay không, giống sapply(). Khác biệt quan trọng là mệnh đề by, thiết lập biến hoặc cột dataframe theo đó bạn muốn thực hiện phép gộp.

Phần tiếp theo sẽ minh họa cách hoạt động.

Ví dụ về aggregate()

Xét bộ dữ liệu ví dụ tên Mydf, chứa dữ liệu về doanh số một sản phẩm, trong đó một số giá trị ở cột biến DepPC lặp lại.

Biến này phân loại dữ liệu theo vị trí địa lý, như phần của mã bưu chính (ở đây các số tương ứng với các quận của Île-de-France, vùng bao gồm Paris).

Bạn muốn làm một số thống kê trên các cột doanh số. Đó là DProgr, một số thứ tự tăng dần theo thời gian, và doanh số sản phẩm (số lượng Qty), cùng một biến logic Delivered, cho biết sản phẩm đã được giao (T) hay chưa (F).

Đầu tiên, bạn có thể làm vài thao tác đơn giản để làm quen với dữ liệu, ngoài việc in toàn bộ bằng cách gõ tên của nó (ở đây chỉ có 120 bản ghi, nhưng hãy hình dung với tệp thực có hàng nghìn dòng!).

Khám phá dữ liệu:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Lưu ý nếu muốn xem số hàng và cột mà dataframe có, bạn cũng có thể gọi nrow(Mydf) và ncol(Mydf).

Còn rất nhiều cách thăm dò dữ liệu khác.

Ở đây, bạn quan tâm biết sản phẩm bán chạy nhất ở quận nào chẳng hạn. Vì vậy bạn nên nhóm dữ liệu theo quận, cộng dồn doanh số Qty cho mỗi quận DepPC bằng hàm aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9

Vậy, aggregate() bảo R rằng bạn muốn cộng tất cả Qty thuộc cùng một quận.

Lưu ý R gán tổng vào biến ‘x’ vì bạn chưa chỉ định khác.

Đầu ra khá dễ đọc, nhưng nếu số quận lớn, có thể sẽ kém trực quan. Khi đó, bạn có thể dùng đồ thị: vẽ kết quả bằng một hệ thống đồ họa của R kết hợp với aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==

Biểu đồ này cho bạn doanh số theo từng quận.

Bạn có thể hỏi cùng câu hỏi nhưng chỉ cho các hàng đã giao. Để làm vậy, trước tiên bạn lấy tập con dữ liệu với Delivered là true (T) bằng toán tử trích chọn quen thuộc "[".

Lưu ý ở đây bạn gán kết quả vào biến mới Y, là một dataframe mới thừa hưởng cùng tên cột từ dataframe gốc Mydf. Làm vậy để tránh lặp lại câu lệnh aggregate trong lúc gọi hàm vẽ cho dễ đọc:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=

Vậy là bạn có thể đặt nhiều câu hỏi khác nhau cho dữ liệu theo cách vector hóa như với aggregate(), và thường làm cùng với một hệ thống vẽ tiện lợi như ggplot2, ý tưởng là như vậy.

Lưu ý rằng để có được điều này, bạn chỉ cần rất ít dòng mã.

Vector hóa như một lựa chọn thay thế cho vòng lặp và các hàm Apply?

Bạn đã thấy vài biến tấu trên cùng một chủ đề: “thao tác trên một tập dữ liệu có cấu trúc theo cách lặp lại”. Theo nghĩa này, các hàm này không chỉ là lựa chọn thay thế cho vòng lặp mà còn là một dạng thực hiện theo kiểu vector hóa.

“Vector hóa” được hiểu theo nghĩa rộng, chúng ta sẽ không bàn luận xem các hàm apply() có thực sự vector hóa hay không (xem ví dụ thảo luận tại đây).

Trong thực tế, để chọn dùng hàm apply() nào, bạn cần cân nhắc:

  • Kiểu dữ liệu đầu vào: đối tượng bạn sẽ thao tác (vector, matrix, array…, list, data frame hoặc kết hợp)
  • Bạn định làm gì: hàm FUN bạn muốn truyền vào
  • Tập con của dữ liệu: hàng, cột, hay tất cả?
  • Bạn muốn kiểu dữ liệu đầu ra nào? Vì có thể bạn còn thao tác tiếp trên đó (và bạn muốn đối tượng mới hay muốn biến đổi trực tiếp đối tượng đầu vào?)

Đây là những câu hỏi khá tổng quát mà bạn cũng có thể đặt ra cho các hàm liên quan như aggregate(), by(), sweep(), v.v.

Nhưng còn nhiều nữa! Đừng dừng khám phá bây giờ! Hãy xem hướng dẫn Arrays in R của DataCamp.

Tiếp nối hướng dẫn này, hãy cân nhắc tham gia các khóa Introduction to R hoặc Intermediate R của DataCamp.

Chủ đề
R
Khoa học Dữ liệu

Tìm hiểu thêm về R

Khóa học

Nhập môn Ngôn ngữ lập trình R

4 giờ
3.1M
Nắm vững kiến thức cơ bản về phân tích dữ liệu trong R, gồm vectors, lists và data frames; luyện tập R với các data set thực tế.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm