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
| 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 |
Đ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),]
| 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 |
Đ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àm | Kết quả trả về | Phù hợp nhất cho | Gói |
|---|---|---|---|
sort() | Giá trị đã sắp xếp | Vector | Base R |
order() | Chỉ số | Data frame, sắp xếp phức tạp | Base R |
arrange() | Data frame đã sắp xếp | Quy trình Tidyverse | dplyr |
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 vectororder()để 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.
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
sort()để sắp xếp trực tiếp một vector và trả về các giá trị đã sắp xếporder()để lấy các chỉ số sẽ sắp xếp một vector—lý tưởng để sắp xếp data framedplyr::arrange()để có cách sắp xếp data frame hiện đại, dễ đọcna.last(TRUE đặt NA ở cuối, FALSE ở đầu)decreasing = TRUEhoặ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 khiorder()trả về chỉ số,sort()trả về trực tiếp các giá trị đã sắp xếp:Điểm khác biệt quan trọng là
sort()cho bạn các giá trị đã sắp xếp, cònorder()cho bạn vị trí của chúng. Điều này khiếnorder()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:Các đối số trong
order()có ý nghĩa:order()trong RHãy xem một ví dụ về
order()hoạt động.Đoạn mã dưới đây tạo một vector
ychứa danh sách số. Tôi sẽ dùngorder(y)để lấy các chỉ số sẽ sắp xếp các số này.Đoạn mã trên cho kết quả sau:
Ở đâ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.Đoạn mã trên cho kết quả sau:
Ở đâ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ằngy[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)
Đoạn mã trên cho kết quả sau:
Ở đâ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)Đoạn mã trên cho kết quả sau:
Ở đâ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)
Đoạn mã trên cho kết quả sau:
Ở đâ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)
Ở đâ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.