Saya mengalami kesulitan mengatur ulang bingkai data berikut:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Saya ingin membentuknya kembali sehingga setiap variabel "nama" yang unik adalah nama belakang, dengan "nilai" sebagai pengamatan di sepanjang baris itu dan "angka" sebagai colnames. Semacam seperti ini:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Saya telah melihat melt
dan cast
dan beberapa hal lainnya, tetapi tampaknya tidak ada yang melakukan pekerjaan.
Jawaban:
Menggunakan
reshape
fungsi:sumber
reshape
disertakanstats
. Belum lagi lebih cepat! =)reshape
adalah contoh luar biasa untuk API fungsi yang mengerikan. Itu sangat dekat dengan tidak berguna.reshape
komentar dan nama-nama argumen yang sama tidak semua yang membantu. Namun, saya telah menemukan bahwa untuk panjang ke lebar, Anda perlu memberikan datadata =
Anda.frame,idvar
= variabel yang mengidentifikasi grup Anda,v.names
= variabel yang akan menjadi beberapa kolom dalam format lebar,timevar
= variabel yang berisi nilai-nilai yang akan ditambahkan untukv.names
di format lebar,direction = wide
dansep = "_"
. Cukup jelas? ;)Paket baru (tahun 2014)
tidyr
juga melakukan ini secara sederhana, dengangather()
/spread()
menjadi syarat untukmelt
/cast
.Sunting: Sekarang, pada tahun 2019, tidyr v 1.0 telah diluncurkan dan ditetapkan
spread
dangather
di jalur penghentian, lebih memilihpivot_wider
danpivot_longer
, yang dapat Anda temukan dijelaskan dalam jawaban ini . Baca terus jika Anda ingin melihat sekilas ke dalam kehidupan singkatspread/gather
.Dari github ,
sumber
tidyr
danreshape2
. Ini memberikan contoh dan penjelasan yang baik.Anda dapat melakukan ini dengan
reshape()
fungsi, atau denganmelt()
/cast()
fungsi dalam paket membentuk kembali. Untuk opsi kedua, contoh kode adalahAtau menggunakan
reshape2
sumber
cast
ataudcast
tidak akan berfungsi dengan baik jika Anda tidak memiliki kolom "nilai" yang jelas. Cobadat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)
dan Anda tidak akan mendapatkan apa yang Anda harapkan. Anda perlu secara eksplisit mencatatvalue/value.var
-cast(dat, id ~ index, value="blah")
dandcast(dat, id ~ index, value.var="blah")
misalnya.Opsi lain jika kinerja menjadi perhatian adalah menggunakan
data.table
ekstensireshape2
fungsi lebur & saluran( Referensi: Pembentukan ulang secara efisien menggunakan data.tables )
Dan, pada data.table v1.9.6 kita dapat menampilkan beberapa kolom
sumber
data.table
pendekatan adalah yang terbaik! sangat efisien ... Anda akan melihat perbedaannya ketikaname
kombinasi 30-40 kolom !!Menggunakan contoh dataframe Anda, kami dapat:
sumber
Dua opsi lainnya:
Paket dasar:
sqldf
paket:sumber
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)
Menggunakan
aggregate
fungsi dasar R :sumber
Dengan versi devel
tidyr
‘0.8.3.9000’
, adapivot_wider
danpivot_longer
yang digeneralisasi untuk melakukan pembentukan kembali (panjang -> lebar, lebar -> panjang, masing-masing) dari 1 ke beberapa kolom. Menggunakan data OPkolom -sama panjang -> lebar
-> membuat kolom lain untuk menunjukkan fungsionalitas
sumber
Fungsi dasar
reshape
berfungsi dengan baik:Dimana
idvar
adalah kolom kelas yang memisahkan baristimevar
adalah kolom kelas untuk dilempar lebarv.names
adalah kolom yang berisi nilai numerikdirection
menentukan format lebar atau panjangsep
argumen opsional adalah pemisah yang digunakan di antaratimevar
nama-nama kelas danv.names
dalam outputdata.frame
.Jika tidak
idvar
ada, buat satu sebelum menggunakanreshape()
fungsi:Ingat itu
idvar
wajib! Bagiantimevar
danv.names
mudah. Output dari fungsi ini lebih dapat diprediksi daripada yang lain, karena semuanya didefinisikan secara eksplisit.sumber
Ada paket baru yang sangat kuat dari para ilmuwan data jenius di Win-Vector (orang yang membuat
vtreat
,seplyr
danreplyr
) disebutcdata
. Ini mengimplementasikan prinsip "data terkoordinasi" yang dijelaskan dalam dokumen ini dan juga dalam posting blog ini . Idenya adalah bahwa terlepas dari bagaimana Anda mengatur data Anda, itu harus mungkin untuk mengidentifikasi titik data individual menggunakan sistem "koordinat data". Berikut kutipan dari posting blog terbaru oleh John Mount:Kami pertama-tama akan membangun tabel kontrol (lihat posting blog untuk detail) dan kemudian melakukan pemindahan data dari baris ke kolom.
sumber
cara yang jauh lebih mudah!
jika Anda ingin kembali dari lebar ke panjang, hanya ubah Lebar ke Panjang, dan tidak ada perubahan pada objek.
sumber