Sắp xếp các cột của khung dữ liệu theo tên cột


93

Đây có thể là một câu hỏi đơn giản, nhưng tôi không biết cách sắp xếp các cột theo thứ tự bảng chữ cái.

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

Tôi muốn sắp xếp các cột theo tên cột theo thứ tự bảng chữ cái, để đạt được

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Đối với những người khác, tôi muốn thứ tự xác định của riêng mình:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Xin lưu ý rằng tập dữ liệu của tôi rất lớn, với 10000 biến. Vì vậy, quy trình cần được tự động hóa hơn.

Câu trả lời:


137

Bạn có thể sử dụng ordertrên namesvà sử dụng để sắp xếp các cột khi thiết lập con:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

Đối với thứ tự xác định của riêng bạn, bạn sẽ cần xác định ánh xạ của riêng bạn về các tên với thứ tự. Điều này sẽ phụ thuộc vào cách bạn muốn thực hiện điều này, nhưng hoán đổi bất kỳ chức năng nào sẽ thành chức năng này với orderở trên sẽ cho kết quả mong muốn của bạn.

Ví dụ, bạn có thể xem Thứ tự các hàng của khung dữ liệu theo một vectơ mục tiêu chỉ định thứ tự mong muốn , tức là bạn có thể matchkhung dữ liệu của mình namesdựa trên một vectơ mục tiêu chứa thứ tự cột mong muốn.


3
Để xây dựng chi tiết, test [, c (2,3,1)] hoặc test [, c ('A', 'B', 'C')] sẽ tạo ra thứ tự cột A, B, C. Toán tử "[" rất thông minh trong việc tìm ra những gì bạn muốn làm.
Carl Witthoft

2
cảm ơn bạn, tôi đã tìm ra câu hỏi thứ hai với sự trợ giúp được cung cấp; myorder = c ("B", "A", "C"), test [, myorder]
John Clark

Có cách nào để sắp xếp các cột theo cách tôi muốn (giả sử CAB) không?
TYZ

Bạn có thể tận dụng thực tế là một data.frame là danh sách và làm cho nó đơn giản hơn :: test[ order(names(test)) ]
ctbrown

1
@naco Không có, đọc nguồn của colnames: nó kết thúc cuộc gọi namescho một data.frame.
James

27

Đây là dplyrcâu trả lời bắt buộc trong trường hợp ai đó muốn làm điều này với đường ống.

test %>% 
    select(sort(names(.)))

4
Đối với tôi, điều này hoạt động tốt vì thật dễ dàng để chọn các biến tôi muốn trước tiên. Gắn bó với các df gốc: test%>%select(b,sort(names(.)))sẽ đặt nó là "b, a, c"
Silentdevildoll

@Silentdevildoll đó là một ứng dụng tuyệt vời! Tôi không nghĩ về điều đó.
Andrew Brēza

14
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

Sử dụng chức năng thay thế đơn giản sau có thể được thực hiện (nhưng chỉ khi khung dữ liệu không có nhiều cột):

test <- test[, c("A", "B", "C")]

cho người khác:

test <- test[, c("B", "A", "C")]

6
  test[,sort(names(test))]

sắp xếp theo tên của các cột có thể hoạt động dễ dàng.


4

Nếu bạn chỉ muốn một hoặc nhiều cột ở phía trước và không quan tâm đến thứ tự của phần còn lại:

require(dplyr)
test %>%
  select(B, everything())

2

Vì vậy, để có một cột cụ thể đứng trước, sau đó đến phần còn lại theo thứ tự bảng chữ cái, tôi đề xuất giải pháp này:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]

và nếu bạn muốn nhiều hơn một cột ở vị trí đầu tiên, thì sao?
Maksym Moroz

2

Một tùy chọn thay thế là sử dụng str_sort()từ thư viện stringr , với đối số numeric = TRUE. Điều này sẽ sắp xếp chính xác cột bao gồm các số không chỉ theo thứ tự bảng chữ cái :

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11


1

Tương tự như các cú pháp khác ở trên nhưng để học - bạn có thể sắp xếp theo tên cột không?

sort(colnames(test[1:ncol(test)] ))

[1:ncol(test)]đây không làm gì cả, đó chỉ là một cách viết dài hơn sort(colnames(test)).
Gregor Thomas

0

Đây là những gì tôi đã tìm ra để đạt được vấn đề tương tự với tập dữ liệu của mình.

Đầu tiên, hãy làm những gì James đã đề cập ở trên, tức là

test[ , order(names(test))]

Thứ hai, sử dụng hàm everything () trong dplyr để di chuyển các cột cụ thể được quan tâm (ví dụ: "D", "G", "K") ở đầu khung dữ liệu, đặt các cột được sắp xếp theo thứ tự bảng chữ cái sau các cột đó.

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.