Sắp xếp DataFrame trong R: Hàm order() kèm ví dụ
⚡ Tóm tắt thông minh
Việc sắp xếp một data frame trong R dựa vào hàm order(), hàm này trả về vị trí hàng chứ không phải giá trị. Truyền các vị trí đó vào trong dấu ngoặc vuông sẽ sắp xếp lại các hàng theo một cột, nhiều cột hoặc theo thứ tự giảm dần.

Sắp xếp dữ liệu trong R
Trong phân tích dữ liệu bạn có thể loại dữ liệu của bạn theo một biến nhất định trong tập dữ liệu. Trong R, chúng ta có thể sử dụng sự trợ giúp của hàm order(). Trong R, chúng ta có thể dễ dàng sắp xếp một vectơ biến liên tục hoặc biến nhân tố. Việc sắp xếp dữ liệu có thể tăng dần or giảm dần trật tự.
Cú pháp:
sort(x, decreasing = FALSE, na.last = NA)
Tranh luận:
- x: Một vectơ chứa biến liên tục hoặc biến nhân tố
- giảm: Điều khiển hướng sắp xếp. Theo mặc định, chế độ giảm dần được đặt thành FALSE, cho ra thứ tự tăng dần.
- na.last: Cho biết liệu các giá trị NA có nên được đặt ở cuối hay không. Hàm sort() sử dụng NA theo mặc định, tức là loại bỏ các giá trị thiếu; hàm order() sử dụng TRUE, tức là giữ lại các giá trị đó và đặt chúng ở cuối.
So sánh sort(), order() và rank() trong R.
Cú pháp trên thuộc về hàm sort(), nhưng mọi ví dụ trên trang này đều gọi hàm order(). Hai hàm này giải quyết các vấn đề khác nhau, và việc nhầm lẫn chúng là lý do phổ biến nhất khiến việc sắp xếp dường như thất bại. Hàm rank() hoàn thiện bộ ba này.
| Chức năng | Hoàn trả | Sử dụng nó khi | Xử lý NA mặc định |
|---|---|---|---|
| sắp xếp () | Các giá trị đó, theo thứ tự | Bạn chỉ cần một vectơ đã được sắp xếp. | na.last = NA nên NA bị loại bỏ |
| đặt hàng() | Vị trí các hàng tạo nên thứ tự đã sắp xếp | Bạn cần sắp xếp lại toàn bộ khung dữ liệu. | na.last = TRUE, vì vậy NA sẽ được đặt ở cuối. |
| thứ hạng() | Thứ hạng của mỗi phần tử ở vị trí ban đầu của nó | Bạn cần một cột xếp hạng, chứ không phải một bảng được sắp xếp lại. | na.last = TRUE |
Vì hàm order() trả về vị trí, nên nó là hàm duy nhất trong ba hàm có thể điều khiển việc chọn tập con bằng dấu ngoặc vuông được sử dụng xuyên suốt trang này. Tài liệu cơ bản của R về hàm order() Liệt kê mọi đối số, bao gồm cả đối số phương thức dùng để chọn thuật toán sắp xếp.
Ví dụ 1: Sắp xếp Data Frame theo một cột
Ví dụ, chúng ta có thể tạo một khung dữ liệu tibble và sắp xếp một hoặc nhiều biến. Khung dữ liệu tibble là một phiên bản hiện đại của... khung dữ liệuNó cải thiện cú pháp của khung dữ liệu và tránh việc định dạng kiểu dữ liệu gây khó chịu, đặc biệt là việc chuyển đổi ký tự sang yếu tố. Nó cũng là một cách thuận tiện để tạo khung dữ liệu thủ công, đó là mục đích của chúng ta ở đây. Để tìm hiểu thêm về tibble, vui lòng tham khảo tài liệu hướng dẫn: https://tibble.tidyverse.org/articles/tibble.html
Đoạn mã bên dưới tạo ra một tibble 50 hàng gồm năm cột ngẫu nhiên và sau đó sắp xếp mỗi hàng theo các giá trị trong c1. set.seed(1234) cố định việc rút thăm ngẫu nhiên, do đó các số giống nhau sẽ xuất hiện trên bất kỳ máy nào.
library(dplyr) set.seed(1234) data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), c4 = rnorm(50, 5, 1.5), c5 = rnorm(50, 5, 1.5) ) # Sort by c1 df <-data_frame[order(data_frame$c1),] head(df)
Đầu ra:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1.481453 3.477557 4.246283 3.686611 6.0511003 ## 2 1.729941 5.824996 4.525823 6.753663 0.1502718 ## 3 2.556360 6.275348 2.524849 6.368483 5.4787404 ## 4 2.827693 4.769902 5.120089 3.743626 4.0103449 ## 5 2.988510 4.395902 2.077631 4.236894 4.6176880 ## 6 3.122021 6.317305 5.413840 3.551145 5.6067027
Dấu phẩy trước dấu ngoặc đóng rất quan trọng: df[order(…), ] sắp xếp lại các hàng, trong khi df[, order(…)] sẽ sắp xếp lại các cột.
Ví dụ 2: Sắp xếp theo nhiều cột
Mỗi đối số bổ sung được truyền cho hàm order() hoạt động như một tiêu chí phân định thứ tự ưu tiên cho đối số trước đó. Ở đây, khung được sắp xếp theo c3, và các hàng có cùng giá trị c3 sau đó được sắp xếp theo c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Đầu ra:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2.988510 4.395902 2.077631 4.236894 4.617688 ## 2 2.556360 6.275348 2.524849 6.368483 5.478740 ## 3 3.464516 3.914627 2.730068 9.565649 6.016123 ## 4 4.233486 3.292088 3.133568 7.517309 4.772395 ## 5 3.935840 2.941547 3.242078 6.464048 3.599745 ## 6 3.835619 4.947859 3.335349 4.378370 7.240240
Ví dụ 3: Sắp xếp một cột theo thứ tự giảm dần và một cột khác theo thứ tự tăng dần
Mỗi cột có thể mang hướng sắp xếp riêng. Việc thêm dấu trừ vào trước một cột số chỉ đảo chiều hướng sắp xếp của cột đó, vì vậy cách sắp xếp bên dưới sẽ giảm dần ở cột c3 và tăng dần ở cột c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Đầu ra:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 4.339178 4.450214 8.087243 4.5010140 8.410225 ## 2 3.959420 8.105406 7.736312 7.1168936 5.431565 ## 3 3.339023 3.298088 7.494285 5.9303153 7.035912 ## 4 3.397036 5.382794 7.092722 0.7163620 5.620098 ## 5 6.653446 4.733315 6.520536 0.9016707 4.513410 ## 6 4.558559 4.712609 6.380086 6.0562703 5.044277
Thủ thuật dấu trừ chỉ hoạt động trên các cột số. Đối với các cột ký tự hoặc yếu tố, hãy sử dụng order(xtfrm(df$col), decreasing = TRUE), hoặc chuyển sang phương pháp dplyr được trình bày tiếp theo.
Sắp xếp Data Frame bằng hàm arrange() của thư viện dplyr.
Cấu trúc ngoặc vuông trở nên khó đọc khi có nhiều cột và hướng liên quan, bởi vì tên khung được lặp lại bên trong mỗi đối số. dplyr Hàm `arrange()` loại bỏ sự lặp lại đó: các cột được đặt tên một lần, và hàm `desc()` đánh dấu những cột chạy ngược chiều.
library(dplyr) # The same three sorts written with arrange() data_frame %>% arrange(c1) # Example 1 data_frame %>% arrange(c3, c4) # Example 2 data_frame %>% arrange(desc(c3), c4) # Example 3
Có ba điểm khác biệt thực tế đáng lưu ý:
- Dễ đọc: arrange(desc(c3), c4) thể hiện ý định trực tiếp, trong khi order(-data_frame$c3, data_frame$c4) che giấu ý định đó đằng sau dấu trừ.
- Loại cộtHàm desc() hoạt động trên cả cột ký tự và cột yếu tố cũng như cột số, vì vậy không cần sử dụng hàm xtfrm() để thay thế.
- Giá trị bị mất: Hàm arrange() luôn đặt NA ở vị trí cuối cùng, bất kể thứ tự nào, trong khi hàm order() cho phép bạn di chuyển chúng bằng na.last.
Hàm arrange() trả về một data frame mới và giữ nguyên data frame gốc, giống hệt như phiên bản sử dụng dấu ngoặc vuông, vì vậy kết quả vẫn cần được gán một tên để giữ lại. Các data frame được nhóm chỉ được sắp xếp trong từng nhóm khi tham số .by_group = TRUE được cung cấp.
Sắp xếp các giá trị kiểu Ký tự, Yếu tố và Giá trị thiếu trong R
Các cột số được sắp xếp theo quy luật nhất định. Văn bản, danh mục và khoảng trống thì không, và mỗi loại trong ba loại này cần một quyết định khác nhau.
Giá trị bị thiếu. Hàm sort() và order() không thống nhất về cách xử lý giá trị NA, đó là lý do tại sao cùng một cột có thể tạo ra hai số lượng hàng khác nhau:
x <- c(3, NA, 1, 2) sort(x) # missing values dropped sort(x, na.last = TRUE) # missing values pushed to the end order(x) # NA indexed last by default order(x, na.last = FALSE) # NA indexed first
Các nhân tố. A yếu tố Sắp xếp theo thứ tự cấp độ, không phải theo thứ tự bảng chữ cái. Đó chính xác là điều bạn muốn đối với các danh mục được sắp xếp theo thứ tự như thấp, trung bình và cao, và chính xác là điều bạn không muốn nếu các cấp độ được tạo theo thứ tự các giá trị xuất hiện:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Cột ký tự. Văn bản thuần túy được sắp xếp theo thứ tự sắp xếp của ngôn ngữ địa phương, vì vậy chữ hoa và dấu phụ có thể làm thay đổi kết quả giữa các máy. Hai thói quen giúp tránh những bất ngờ: kiểm tra class(df$col) trước khi sắp xếp và chuyển đổi các chữ số được lưu trữ dưới dạng văn bản bằng as.numeric() để "10" không đứng trước "2".
