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.

  • 🔢 Các hàm cơ bản của order(): Hàm order() trả về chỉ số hàng sắp xếp một cột theo thứ tự tăng dần, chứ không phải chính các giá trị đã được sắp xếp.
  • 📌 Cột đơn: df[order(df$c1), ] sắp xếp lại mọi hàng của khung theo các giá trị được lưu trong c1.
  • 🧮 Nhiều cột: Các đối số bổ sung đóng vai trò là yếu tố quyết định khi có sự trùng lặp, vì vậy order(df$c3, df$c4) sẽ sắp xếp theo c3 rồi sau đó theo c4.
  • 🔻 Thứ tự giảm dần: Thêm dấu trừ vào đầu cột số hoặc truyền tham số decreasing = TRUE cho hàm sort().
  • 🧩 Tuyến đường tidyverse: Các hàm arrange() và desc() thể hiện chính xác các kiểu sắp xếp giống như các động từ dplyr dễ đọc.
  • ⚠️ Giá trị bị mất: Theo mặc định, order() đặt các giá trị NA ở cuối, trong khi sort() loại bỏ các giá trị thiếu trừ khi na.last được thiết lập.

R Sắp xếp khung dữ liệu bằng Order()

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".

Câu Hỏi Thường Gặp

Sử dụng df[order(rownames(df)), ]. Tên hàng là ký tự, vì vậy việc sắp xếp tuân theo thứ tự sắp xếp văn bản và “10” sẽ đứng trước “2”. Bọc chúng trong as.numeric() khi chúng là số. Tibbles bỏ qua hoàn toàn tên hàng, vì vậy hãy thêm một cột id rõ ràng thay thế.

Truyền tham số `method = “radix”` cho hàm `order()`, đây là tùy chọn nhanh nhất cho số nguyên và chuỗi ngắn. Đối với hàng triệu hàng, `data.table::setorder()` sắp xếp tại chỗ mà không cần sao chép bảng, và lệnh `arrange()` của `dplyr` đã sử dụng thuật toán sắp xếp radix bên trong.

Chỉ mục với trình tự đảo ngược: df[nrow(df):1, ]. Thao tác này đảo ngược thứ tự hiện tại thay vì sắp xếp, điều này rất quan trọng khi khung được xáo trộn hoặc nhóm lại. Đặt lại nhãn sau đó bằng rownames(df) <- NULL nếu chúng trông khó hiểu.

Cột được lưu trữ dưới dạng ký tự hoặc yếu tố, vì vậy R so sánh nó dưới dạng văn bản và đặt “10” trước “2”. Kiểm tra bằng class(df$col), sau đó chuyển đổi bằng as.numeric(as.character(df$col)) trước khi sắp xếp.

Không. Hàm order() trả về một vectơ chỉ mục và df[order(…), ] xây dựng một khung mới, vì vậy khung ban đầu vẫn giữ nguyên cho đến khi kết quả được gán lại. Tên hàng vẫn giữ nguyên giá trị cũ, đây là một manh mối hữu ích cho thấy khung đã được sắp xếp lại.

Các trợ lý AI có thể phát hiện một cột được lưu trữ dưới dạng văn bản khi việc sắp xếp số trông không chính xác, dịch lệnh order() cơ bản trong R thành một pipeline của dplyr và đề xuất một cột ổn định để phân định thứ hạng. Luôn luôn chạy mã và kiểm tra head() trước khi tin tưởng vào kết quả.

Vâng. Trợ lý GitHub Công cụ này hoạt động trên RStudio Desktop 2023.09.0 trở lên và hoàn thành các lệnh gọi order() và arrange() từ một bình luận đơn giản. Posit cảnh báo rằng các đề xuất không mang tính xác định, vì vậy hãy xem xét kỹ từng dòng trước khi chạy.

Sắp xếp lại chỉ số cột thay vì chỉ số hàng. df[, order(names(df))] sắp xếp các cột theo thứ tự bảng chữ cái, và df[, c(“c3”, “c1”)] chọn một thứ tự cụ thể. Người dùng dplyr có thể gọi select(df, c3, c1), thao tác này sẽ sắp xếp lại và chọn tập con trong một bước.

Tóm tắt bài viết này với: