Urutkan kolom dari kerangka data dengan nama kolom

93

Ini mungkin pertanyaan sederhana, tetapi saya tidak tahu bagaimana mengurutkan kolom menurut abjad.

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

Saya suka mengurutkan kolom dengan nama kolom menurut abjad, untuk dicapai

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

Untuk orang lain, saya ingin pesanan saya sendiri:

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

Harap dicatat bahwa dataset saya sangat besar, dengan 10.000 variabel. Jadi prosesnya perlu lebih otomatis.

John Clark
sumber

Jawaban:

137

Anda dapat menggunakan orderdi names, dan menggunakannya untuk mengurutkan kolom saat membuat subset:

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

Untuk pesanan yang Anda tentukan sendiri, Anda perlu menentukan pemetaan nama Anda sendiri untuk pemesanan. Ini akan tergantung pada bagaimana Anda ingin melakukan ini, tetapi menukar fungsi apa pun dengan fungsi di orderatas akan memberikan hasil yang Anda inginkan.

Misalnya, Anda dapat melihat Urutan baris bingkai data sesuai dengan vektor target yang menentukan urutan yang diinginkan , yaitu Anda dapat melihat matchbingkai data Anda namesterhadap vektor target yang berisi urutan kolom yang diinginkan.

James
sumber
3
Untuk menguraikan, test [, c (2,3,1)] atau test [, c ('A', 'B', 'C')] akan menghasilkan urutan kolom A, B, C. Operator "[" sangat pandai dalam menentukan apa yang ingin Anda lakukan.
Carl Witthoft
2
terima kasih, saya menemukan pertanyaan kedua dengan bantuan yang diberikan; myorder = c ("B", "A", "C"), test [, myorder]
John Clark
Apakah ada cara untuk mengurutkan kolom dengan cara yang saya inginkan (misalnya CAB)?
TYZ
Anda dapat memanfaatkan fakta bahwa data.frame adalah sebuah daftar dan membuatnya lebih sederhana :: test[ order(names(test)) ]
ctbrown
1
@naco Tidak, membaca sumber colnames: itu berakhir memanggil namesuntuk data.frame.
James
27

Inilah dplyrjawaban wajib jika seseorang ingin melakukan ini dengan pipa.

test %>% 
    select(sort(names(.)))
Andrew Brēza
sumber
4
Bagi saya ini bekerja dengan baik karena mudah untuk memilih variabel yang saya inginkan terlebih dahulu. Berpegang pada df asli: test%>%select(b,sort(names(.)))akan menaruhnya sebagai "b, a, c"
Silentdevildoll
@Silentdevildoll itu aplikasi keren! Saya tidak memikirkan itu.
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))

Menggunakan penggantian fungsi berikut sederhana dapat dilakukan (tetapi hanya jika bingkai data tidak memiliki banyak kolom):

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

untuk yang lain:

test <- test[, c("B", "A", "C")]
MANOJ KUMAR
sumber
6
  test[,sort(names(test))]

Urutkan nama kolom dapat bekerja dengan mudah.

Shalini Baranwal
sumber
4

Jika Anda hanya menginginkan satu atau beberapa kolom di depan dan tidak peduli dengan urutan sisanya:

require(dplyr)
test %>%
  select(B, everything())
Xavier Jiménez Albán
sumber
2

Jadi untuk memiliki kolom tertentu yang didahulukan, kemudian sisanya menurut abjad, saya akan mengusulkan solusi ini:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
Tom Wagstaff
sumber
dan jika Anda ingin lebih dari satu kolom menjadi yang pertama, lalu apa?
Maksym Moroz
2

Opsi alternatif adalah menggunakan str_sort()dari pustaka stringr , dengan argumen numeric = TRUE. Ini akan mengurutkan kolom dengan benar yang menyertakan angka tidak hanya menurut abjad :

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

# [1] V1 V3 V11

demarsylvain
sumber
1

Mirip dengan sintaks lain di atas tetapi untuk pembelajaran - dapatkah Anda mengurutkan berdasarkan nama kolom?

sort(colnames(test[1:ncol(test)] ))
KNN
sumber
Mereka [1:ncol(test)]tidak melakukan apa-apa di sini, ini hanya cara menulis yang lebih panjang sort(colnames(test)).
Gregor Thomas
0

Inilah yang saya temukan untuk mencapai masalah serupa dengan kumpulan data saya.

Pertama, lakukan apa yang Yakobus sebutkan di atas, yaitu

test[ , order(names(test))]

Kedua, gunakan fungsi everything () di dplyr untuk memindahkan kolom tertentu yang menarik (misalnya, "D", "G", "K") di awal bingkai data, meletakkan kolom yang diurutkan menurut abjad setelah yang itu.

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

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

Brit
sumber