Bagaimana cara mengubah data antara format lebar dan panjang dalam R? [Tutup]

32

Anda dapat memiliki data dalam format lebar atau format panjang. Ini adalah hal yang cukup penting, karena metode yang dapat digunakan berbeda, tergantung pada formatnya. Saya tahu Anda harus bekerja dengan melt()dan cast()dari paket membentuk kembali, tetapi tampaknya ada beberapa hal yang tidak saya dapatkan.

Bisakah seseorang memberi saya gambaran singkat bagaimana Anda melakukan ini?

Penampilan
sumber
Tolong berikan contoh apa yang ingin Anda capai. Apa yang sebenarnya tidak Anda dapatkan?
mpiktas
3
Berikut adalah posting blog saya dengan contoh menggunakan meltdan cast. Konversi dari format lebar ke panjang dilakukan dalam satu tahap. Sebenarnya tidak ada yang lebih istimewa.
mpiktas
Selamat datang di statistik. Anda mungkin menemukan bahwa memasukkan dataset kecil yang dapat direproduksi dalam pertanyaan Anda untuk menjelaskan apa yang Anda inginkan. Baca sigmafield.org/2011/01/18/… untuk lebih lanjut.
PaulHurleyuk
Lihat pertanyaan SO ini untuk banyak cara untuk melakukan ini.
Axeman

Jawaban:

26

Ada beberapa sumber daya di situs web Hadley Wickham untuk paket (sekarang disebut reshape2), termasuk tautan ke sebuah makalah tentang paket dalam Journal of Statistical Software.

Ini adalah contoh singkat dari makalah ini:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Kami mencatat bahwa datanya dalam bentuk luas. Untuk menuju ke bentuk panjang, kami membuat smithskerangka data cair :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Perhatikan bagaimana melt()memilih salah satu variabel sebagai id, tetapi kita dapat menyatakan secara eksplisit mana yang akan digunakan melalui argumen 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Ini adalah contoh lain dari ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Jika kita menyimpan data frame cair, kita bisa dilemparkan ke dalam bentuk lain. Dalam versi baru reshape(disebut reshape2) ada fungsi acast()dan dcast()mengembalikan hasil seperti array (array, matriks, vektor) atau frame data masing-masing. Fungsi-fungsi ini juga mengambil fungsi agregasi (misalnya mean()) untuk memberikan ringkasan data dalam bentuk cair. Misalnya, sebagai lanjutan dari contoh Kualitas Udara di atas, kita dapat menghasilkan, dalam bentuk luas, nilai rata-rata bulanan untuk variabel-variabel dalam kumpulan data:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

Ada benar-benar hanya dua fungsi utama dalam reshape2: melt()dan acast()dan dcast()pasangan. Lihatlah contoh-contoh di halaman bantuan untuk dua fungsi ini, lihat situs web Hadley (tautan di atas) dan lihat kertas yang saya sebutkan. Itu seharusnya bisa Anda mulai.

Anda juga dapat melihat plyrpaket Hadley yang melakukan hal serupa reshape2tetapi dirancang untuk melakukan lebih banyak lagi selain itu.

Pasang kembali Monica - G. Simpson
sumber
dcast(aqm, month ~ variable), apa yang akan dilakukan tanpa fungsi agregasi?
qed
@CravingSpirit itu akan mengembalikan jumlah pengamatan untuk setiap variabel. Baca ?dcastyang akan mengatakan ini kepada Anda (lihat detail untuk argumen fun.aggregate).
Reinstate Monica - G. Simpson
8
  • Quick-R memiliki contoh sederhana menggunakan paket membentuk kembali

  • Lihat juga ?reshape( LINK ) untuk cara R Dasar bergerak antara format lebar dan panjang.

Jeromy Anglim
sumber
7

Anda tidak harus menggunakan meltdan cast.

Membentuk kembali data dapat dilakukan dengan banyak cara. Dalam contoh khusus Anda pada cite use recastwith with Anda aggregateadalah mubazir karena aggregatemelakukan tugas dengan baik sendiri.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Saya suka bagaimana, dalam posting blog Anda, Anda menjelaskan apa yang meltsedang dilakukan. Sangat sedikit orang yang mengerti itu dan begitu Anda melihatnya maka akan lebih mudah untuk melihat cara castkerjanya dan bagaimana Anda bisa menulis fungsi Anda sendiri jika Anda mau.

John
sumber
2

Lihat wiki bentuk ulang . Ini pasti memberikan lebih banyak contoh seperti yang Anda harapkan.

Stéphane Laurent
sumber
2

Hanya memperhatikan tidak ada referensi untuk metode pembentukan kembali yang lebih efisien dan luas di data.tablesini, jadi saya memposting tanpa komentar lebih lanjut jawaban yang sangat baik oleh Zach / Arun di StackOverflow untuk pertanyaan serupa:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

Dan khususnya ada sketsa indah di data.tablehalaman GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

MichaelChirico
sumber