Bagaimana seseorang mengubah input ini (dengan urutan: waktu, masuk, keluar, file):
Time In Out Files
1 2 3 4
2 3 4 5
Untuk output ini (dengan urutan: waktu, keluar, masuk, file)?
Time Out In Files
1 3 2 4
2 4 3 5
Berikut data dummy R:
table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
## Time In Out Files
##1 1 2 3 4
##2 2 3 4 5
help(Extract)
juga dikenal sebagai?'['
Jawaban:
Kerangka data Anda memiliki empat kolom seperti itu
df[,c(1,2,3,4)]
. Perhatikan koma pertama berarti menyimpan semua baris, dan 1,2,3,4 mengacu pada kolom.Untuk mengubah urutan seperti pada pertanyaan di atas lakukan
df2[,c(1,3,2,4)]
Jika Anda ingin menampilkan file ini sebagai csv, lakukan
write.csv(df2, file="somedf.csv")
sumber
df[,c(1,3,2,4:ncol(df))]
saat Anda tidak tahu ada berapa kolom.sumber
data <- data[c(1,3,"Var1", 2)]
?c(1,3,"Var1", 2)
akan dibacac("1","3","Var1", "2")
karena vektor hanya dapat berisi data dari satu jenis, sehingga jenis dipromosikan ke jenis yang paling umum hadir. Karena tidak ada kolom dengan nama karakter "1", "3", dll. Anda akan mendapatkan "kolom yang tidak ditentukan".list(1,3,"Var1", 2)
menyimpan nilai tanpa jenis promosi, tetapi Anda tidak dapat menggunakanlist
dalam konteks di atas.mtcars[c(1,3,2)]
subset berfungsi? Saya akan mengharapkan kesalahan terkait dengan dimensi yang salah atau serupa ... Bukankah seharusnya begitumtcars[,c(1,3,2)]
?Anda juga dapat menggunakan fungsi subset:
Anda sebaiknya menggunakan operator [] seperti pada jawaban lain, tetapi mungkin berguna untuk mengetahui bahwa Anda dapat melakukan subset dan operasi menyusun ulang kolom dalam satu perintah.
Memperbarui:
Anda juga dapat menggunakan fungsi pilih dari paket dplyr:
Saya tidak yakin dengan efisiensi, tetapi berkat sintaks dplyr, solusi ini harus lebih fleksibel, khususnya jika Anda memiliki banyak kolom. Misalnya, berikut ini akan menyusun ulang kolom dari dataset mtcars dalam urutan yang berlawanan:
Dan berikut ini akan memesan ulang hanya beberapa kolom, dan membuang yang lain:
Baca lebih lanjut tentang sintaks pilih dplyr .
sumber
subset()
, lihat pertanyaan ini .everything()
sangat luar biasa;mtcars %>% select(wt, gear, everything())
Seperti yang disebutkan dalam komentar ini , saran standar untuk memesan kembali kolom pada
data.frame
umumnya rumit dan rentan kesalahan, terutama jika Anda memiliki banyak kolom.Fungsi ini memungkinkan untuk mengatur ulang kolom berdasarkan posisi: tentukan nama variabel dan posisi yang diinginkan, dan jangan khawatir tentang kolom lainnya.
Sekarang permintaan OP menjadi sesederhana ini:
Untuk bertukar
Time
danFiles
kolom tambahan, Anda dapat melakukan ini:sumber
Sebuah
dplyr
solusi (bagian daritidyverse
paket set) adalah untuk digunakanselect
:sumber
select(iris, Species, everything())
. Juga perhatikan bahwa kutipan tidak diperlukan.everything()
seperti dalam komentardplyr
'sgroup
juga akan mengatur ulang variabel, jadi hati-hati ketika menggunakan bahwa dalam rantai.Mungkin ini kebetulan bahwa urutan kolom yang Anda inginkan memiliki nama kolom dalam urutan abjad. Karena itu yang dapat Anda lakukan:
Itulah yang saya gunakan ketika saya memiliki file besar dengan banyak kolom.
sumber
!! WARNING !!
data.table
berubahTARGET
menjadi vektor int:TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
untuk memperbaikinya:TARGET <- as.data.frame(TARGET)
TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
Anda dapat menggunakan paket data.table :
Cara menyusun ulang kolom data.table (tanpa menyalin)
sumber
The tiga teratas jawaban memiliki kelemahan.
Jika kerangka data Anda terlihat seperti ini
maka itu solusi yang buruk untuk digunakan
Itu berhasil, tetapi Anda baru saja memperkenalkan ketergantungan pada urutan kolom pada input Anda.
Gaya pemrograman rapuh ini harus dihindari.
Penamaan eksplisit kolom adalah solusi yang lebih baik
Plus, jika Anda bermaksud untuk menggunakan kembali kode Anda dalam pengaturan yang lebih umum, Anda bisa
yang juga cukup bagus karena sepenuhnya mengisolasi literal. Sebaliknya, jika Anda menggunakan dplyr
select
maka Anda akan mengatur orang-orang yang akan membaca kode Anda nanti, termasuk diri Anda sendiri, untuk sedikit penipuan. Nama kolom digunakan sebagai literal tanpa muncul dalam kode.
sumber
dplyr
versi1.0.0
mencakuprelocate()
fungsi untuk menyusun ulang kolom dengan mudah:atau
sumber
sumber
setcolorder
.Satu-satunya yang saya lihat bekerja dengan baik adalah dari sini .
Gunakan seperti ini:
Bekerja seperti pesona.
sumber