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

Cách sắp xếp dữ liệu trong R: Hướng dẫn đầy đủ

Tìm hiểu cách sắp xếp vectors, data frames và hơn thế nữa trong R bằng order(), sort() và arrange() của dplyr với các ví dụ thực tế.
· 6 phút đọc

Khám phá cùng AI

R cung cấp nhiều cách để sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần; Các nhà phân tích và nhà khoa học dữ liệu sử dụng order(), sort() và các gói như dplyr để sắp xếp dữ liệu tùy theo cấu trúc của dữ liệu thu được.

TL;DR

  • Dùng sort() để sắp xếp trực tiếp một vector và trả về các giá trị đã sắp xếp
  • Dùng order() để lấy các chỉ số sẽ sắp xếp một vector—lý tưởng để sắp xếp data frame
  • Dùng dplyr::arrange() để có cách sắp xếp data frame hiện đại, dễ đọc
  • Xử lý giá trị NA với tham số na.last (TRUE đặt NA ở cuối, FALSE ở đầu)
  • Sắp xếp giảm dần với decreasing = TRUE hoặc bằng cách dùng dấu trừ

order() có thể sắp xếp vector, ma trận, và cả một data frame theo thứ tự tăng dần hoặc giảm dần, như được minh họa ở phần cuối của hướng dẫn này.

Cú pháp của order()

Hàm sort()

Trước khi đi sâu vào order(), hãy xem hàm đơn giản hơn là sort(). Trong khi order() trả về chỉ số, sort() trả về trực tiếp các giá trị đã sắp xếp:

# Create a vector
values <- c(4, 12, 6, 7, 2, 9, 5)

# sort() returns the sorted values directly
sort(values)
[1]  2  4  5  6  7  9 12

Điểm khác biệt quan trọng là sort() cho bạn các giá trị đã sắp xếp, còn order() cho bạn vị trí của chúng. Điều này khiến order() hữu ích hơn khi sắp xếp data frame, như bạn sẽ thấy sau.

Cú pháp của order()

Cú pháp của order() như sau:

order(x, decreasing = TRUE or FALSE, na.last = TRUE or FALSE, method = c("auto", "shell", "quick", "radix"))

Các đối số trong order() có ý nghĩa:

  • x: data frame, ma trận, hoặc vector
  • decreasing: giá trị boolean; TRUE thì sắp xếp giảm dần, FALSE thì sắp xếp tăng dần.
  • na.last: giá trị boolean; TRUE thì đặt chỉ số NA ở cuối, FALSE thì đặt ở đầu.
  • method: phương pháp sắp xếp sẽ dùng.

order() trong R

Hãy xem một ví dụ về order() hoạt động.

Đoạn mã dưới đây tạo một vector y chứa danh sách số. Tôi sẽ dùng order(y) để lấy các chỉ số sẽ sắp xếp các số này.

y <- c(4, 12, 6, 7, 2, 9, 5)
order(y)

Đoạn mã trên cho kết quả sau:

5 1 7 3 4 6 2

Ở đây order() sẽ sắp xếp các số theo chỉ số của chúng theo thứ tự tăng dần. Vì số 2 là nhỏ nhất, có chỉ số là năm, còn số 4 có chỉ số là 1, và tương tự, quá trình tiếp tục theo cùng một quy luật.

y <- c(4, 12, 6, 7, 2, 9, 5)
y[order(y)]

Đoạn mã trên cho kết quả sau:

2 4 5 6 7 9 12

Ở đây việc đánh chỉ số theo thứ tự được thực hiện, nơi các giá trị thực được in theo thứ tự tăng dần. Các giá trị được sắp theo chỉ số bằng order() rồi lần lượt truy cập mỗi giá trị bằng y[giá-trị-nào-đó].

Sắp xếp vector với các tham số khác nhau trong order()

Xem một ví dụ trong đó tập dữ liệu chứa giá trị ký hiệu NA (Không có sẵn).

order(x,na.last=TRUE)

x <- c(8, 2, 4, 1, -4, NA, 46, 8, 9, 5, 3)
order(x, na.last = TRUE)

Đoạn mã trên cho kết quả sau:

5 4 2 11 3 10 1 8 9 7 6

Ở đây order() cũng sẽ sắp xếp danh sách số theo chỉ số của chúng theo thứ tự tăng dần. Do có NA, chỉ số của nó sẽ được đặt ở cuối, tức 6 sẽ đứng cuối vì na.last=TRUE.

order(x,na.last=FALSE)

order(x, na.last = FALSE)

Đoạn mã trên cho kết quả sau:

6 5 4 2 11 3 10 1 8 9 7

Ở đây order() cũng sẽ sắp xếp danh sách số theo chỉ số theo thứ tự tăng dần. Do có NA, chỉ số của nó là 6 sẽ được đặt ở đầu vì na.last=FALSE.

order(x,decreasing=TRUE,na.last=TRUE)

order(x, decreasing = TRUE, na.last = TRUE)

Đoạn mã trên cho kết quả sau:

7 9 1 8 10 3 11 2 4 5 6

Ở đây order() sẽ sắp xếp danh sách số theo chỉ số theo thứ tự giảm dần vì decreasing=TRUE: 46 là lớn nhất được đặt ở chỉ số 7, và các giá trị còn lại được sắp giảm dần. Do có NA, chỉ số 6 sẽ đặt ở cuối vì na.last=TRUE.

order(x,decreasing=FALSE,na.last=FALSE)

order(x, decreasing = FALSE, na.last = FALSE)

Ở đây có NA với chỉ số là 6 sẽ được đặt lên đầu vì na.last=FALSE. order() sẽ sắp xếp danh sách số theo chỉ số theo thứ tự tăng dần vì decreasing=FALSE: -4 là nhỏ nhất đặt ở chỉ số 5, và các giá trị còn lại tăng dần.

Sắp xếp một dataframe bằng order()

Hãy tạo một data frame với kích thước dân số là 10. Biến gender gồm các giá trị vector 'male' và 'female' trong đó 10 giá trị mẫu có thể lấy bằng sample(), còn replace = TRUE sẽ chỉ tạo các giá trị duy nhất. Tương tự, age gồm các giá trị từ 25 đến 75, cùng với degree có các khả năng là c("MA," "ME," "BE," "BSCS"), cũng sẽ tạo giá trị duy nhất.

Nhiệm vụ: Sắp xếp dữ liệu đã cho theo thứ tự tăng dần dựa trên độ tuổi của tập dân số.

Lưu ý: Dữ liệu mẫu hiển thị có thể khác khi bạn chạy trên máy của mình vì mỗi lần chạy sẽ tạo một dataframe duy nhất.

population <- 10
gender <- sample(c("male", "female"), population, replace = TRUE)
age <- sample(25:75, population, replace = TRUE)
degree <- sample(c("MA", "ME", "BE", "BSCS"), population, replace = TRUE)
final_data <- data.frame(gender = gender, age = age, degree = degree)
final_data
genderagedegree
male40MA
female57BSCS
male66BE
female61BSCS
female48MA
male25MA
female49BE
male52ME
female57MA
female35MA

Đoạn mã trên cho kết quả như dưới đây, hiển thị một dataframe vừa tạo.

  gender       age        degree
   male           40         MA
   female       57         BSCS
   male           66         BE
   female       61         BSCS
   female       48        MA
   male           25         MA
   female       49         BE
   male        52        ME
   female       57         MA
   female       35         MA

Hãy sắp xếp dataframe theo thứ tự tăng dần bằng order() dựa trên biến age.

order(final_data$age)

Đoạn mã trên cho kết quả sau:

6 10 3 9 5 8 4 2 7 1

Vì tuổi 25 ở chỉ số 6, tiếp theo là tuổi 35 ở chỉ số 10 và tương tự, tất cả giá trị tuổi được sắp xếp tăng dần.

Đoạn mã dưới đây dùng toán tử [] với biến age để sắp xếp tăng dần, đồng thời in kèm thông tin giới tính và học vị.

final.data[order(final.data$age),]
 genderagedegree
6male25MA
10female35MA
1male40MA
5female48MA
7female49BE
8male52ME
2female57BSCS
9female57MA
4female61BSCS
3male66BE

Đoạn mã trên cho kết quả sau:

gender    age    degree
6    male    25    MA
10    female    35    MA
1    male    40    MA
5    female    48    MA
7    female    49    BE
8    male    52    ME
2    female    57    BSCS
9    female    57    MA
4    female    61    BSCS
3    male    66    BE

Kết quả cho thấy độ tuổi được sắp xếp tăng dần, kèm theo thông tin giới tính và học vị tương ứng.

Sắp xếp với arrange() của dplyr

Để có cách tiếp cận hiện đại, dễ đọc hơn, bạn có thể dùng hàm arrange() từ gói dplyr. Điều này đặc biệt hữu ích khi làm việc trong hệ sinh thái tidyverse:

# Install dplyr if needed: install.packages("dplyr")
library(dplyr)

# Sort by age in ascending order
final_data %>% arrange(age)

# Sort by age in descending order
final_data %>% arrange(desc(age))

# Sort by multiple columns
final_data %>% arrange(gender, desc(age))

Hàm arrange() thường được ưa chuộng trong các quy trình phân tích dữ liệu vì nó tích hợp mượt mà với các hàm khác của dplyr như filter(), select() và mutate() thông qua toán tử pipe.

So sánh các phương pháp sắp xếp

HàmKết quả trả vềPhù hợp nhất choGói
sort()Giá trị đã sắp xếpVectorBase R
order()Chỉ sốData frame, sắp xếp phức tạpBase R
arrange()Data frame đã sắp xếpQuy trình Tidyversedplyr
setorder()Chỉnh sửa tại chỗTập dữ liệu lớn (tiết kiệm bộ nhớ)data.table

Kết luận

Trong hướng dẫn này, tôi đã trình bày các phương pháp thiết yếu để sắp xếp dữ liệu trong R:

  • sort() để sắp xếp trực tiếp vector
  • order() để lấy chỉ số nhằm sắp xếp vector và data frame
  • Xử lý giá trị NA với tham số na.last
  • dplyr::arrange() để sắp xếp data frame theo cách hiện đại, dễ đọc
  • Sắp xếp đa cột cho các yêu cầu sắp xếp phức tạp

Để biết thêm thông tin, xem tài liệu R chính thức về order().

Nếu bạn muốn học thêm về R, hãy tham gia khóa Introduction to R của DataCamp. Bạn cũng có thể khám phá hướng dẫn data.table để thao tác dữ liệu hiệu năng cao, hoặc xem hướng dẫn về pipes trong R để viết mã gọn gàng hơn.

Chủ đề

Liên quan