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.

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.


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(.)))

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")]


4

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

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

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")))]

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


1

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

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

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())

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.