Lewati ke konten utama

Data Long ke Wide di R

Pelajari alasan Anda mengubah data dari format long ke wide dan sebaliknya serta jelajahi caranya di R dengan melt() dan dcast()!
· 15 mnt Baca

Jelajahi bersama AI

Ada kalanya Anda perlu mengonversi data dalam format long (disebut "long-form", artinya akan jelas nanti) ke format wide dan sebaliknya. Data di dunia nyata hadir dalam berbagai format, tetapi sebagian besar fungsi R dirancang untuk satu bentuk tertentu.

Misalnya, lme4::lmer() untuk pemodelan linear campuran, ggplot2::ggplot() untuk visualisasi dirancang untuk long-form. Namun ada juga fungsi lain yang dirancang untuk wide-form seperti mosaicplot(). Artinya, Anda perlu mengonversi bentuk data untuk melakukan analisis atau visualisasi kecuali datanya sudah diproses dan berada dalam bentuk yang benar.

Ada beberapa opsi di R untuk konversi format, tetapi bisa cukup membingungkan saat Anda baru memulai.

Tutorial ini akan menunjukkan cara memahami mekanisme konversi data antara long-form dan wide-form. Anda akan mempelajari topik-topik berikut:

  • Anda akan mempelajari lebih lanjut tentang long form.
  • Kemudian, Anda akan mengenal wide form.
  • Anda akan meninjau perbedaan antara format long dan wide;
  • Setelah itu Anda akan melihat langkah-langkah yang perlu dilakukan untuk beralih dari satu bentuk ke bentuk lainnya.
  • Terakhir, Anda akan mengimplementasikan semuanya dengan bantuan R. Anda akan belajar cara beralih dari format long ke format wide dengan fungsi melt() dan dcast().

Data

Tabel 01
namegenderyear2011year2012year2013year2014year2015
Jackson SmithM74.6984.9991.73105.11111.04
Sophia JohnsonFNANANANA75.89
Emma WilliamsFNANA75.7486.5091.50
Aiden JonesMNANANA71.8981.42
Liam BrownM88.2496.91101.85108.13112.45
Lucas DavisM70.6083.7894.17100.03106.35
Olivia MillerF64.7880.7687.3097.13103.80
Ava WilsonF88.7796.45104.72112.84NA

Tabel ini menunjukkan tinggi badan bayi di suatu wilayah kecil. Tinggi diukur dari tahun 2011 hingga 2015. Seperti yang mungkin sudah Anda ketahui, NA berarti ‘Not Available’ (Tidak Tersedia). Dari posisi NA, Anda bisa menebak usia bayi, tetapi usia tepat seorang bayi tidak tersedia dari tabel. Tabelnya terlihat rapi, tetapi bagi siapa pun yang ingin mempelajari pertumbuhan bayi, ada masalah: informasi pentingnya bukan waktu absolut saat bayi diukur, melainkan usia bayi saat ia diukur. Bisakah Anda memasukkan informasi ini ke dalam tabel? Di bawah ini, Anda dapat melihat salah satu caranya:

Tabel 02
namegenderage0age1age2age3age4age5age6
Jackson SmithMNA76.6984.9197.06105.73107.32NA
Sophia JohnsonFNA76.05NANANANANA
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA
Liam BrownMNANA85.3493.22105.78105.84114.82
Lucas DavisM71.5984.8792.10100.73104.21NANA
Olivia MillerF62.7481.3992.0298.32106.44NANA
Ava WilsonFNANA88.39100.67107.58111.52NA

Jumlah NA bertambah. ## Data Bentuk Wide Namun bagaimana jika Anda ingin menyampaikan berapa bulan usia seorang bayi? Itu akan terlihat seperti ini:

Tabel 03
namegenderm4m6m7m10m12...m55m60m65m72
Jackson SmithMNANANANA76.69...NA107.32NANA
Sophia JohnsonFNANANANA76.05...NANANANA
Emma WilliamsFNANANA72.65NA...NANANANA
Aiden JonesMNA69.76NANANA...NANANANA
Liam BrownMNANANANANA...NA105.84NA114.82
Lucas DavisMNANA71.59NANA...104.21NANANA
Olivia MillerF62.74NANANANA...NANANANA
Ava WilsonFNANANANANA...NANA111.52NA

Terdapat banyak NA pada tabel di atas. Jika waktu pengukuran relatif para bayi berbeda, wide form dapat membuang banyak ruang. Opsi lain adalah memasukkan usia bayi ketika tahun 2015, tetapi itu hanya mungkin ketika waktu pengukuran absolut semuanya sama. Jika para bayi berbeda waktu pengukurannya per bulan dan Anda ingin mengetahui usia dalam bulan, itu tidak berhasil. Maka contoh ini tampaknya satu-satunya cara. Dalam kasus ini, Anda dapat mempertimbangkan menggunakan long-form. ## Data dalam Long Form Jika semua pengukuran dari satu bayi ditampilkan dalam satu baris pada wide-form, pada long-form Anda hanya akan melihat satu pengukuran dari seorang bayi di satu baris. Cara paling sederhana untuk memperoleh yang terakhir adalah menampilkan nama anak, waktu pengukuran, dan pengukuran (tinggi) dalam satu baris. Inilah yang persis ditunjukkan tabel ini:

Tabel 04
namegendermonthheight
Olivia MillerF462.74
Aiden JonesM669.76
Lucas DavisM771.59
Emma WilliamsF1072.65
Jackson SmithM1276.69
............
Liam BrownM72114.82

Jika Anda mengurutkan data berdasarkan nama, Anda akan mendapatkan sesuatu seperti tabel di bawah ini. Jelas, tabel ini memakan ruang lebih kecil daripada Tabel 3 di atas!

Tabel 05
namegendermonthheight
Jackson SmithM1276.69
Jackson SmithM2484.91
Jackson SmithM3697.06
Jackson SmithM48105.73
Jackson SmithM60107.32
Sophia JohnsonF1276.05
Emma WilliamsF1072.65
............
Ava WilsonF65111.52

Long versus Wide

Catatan lagi perbedaan mendasar antara wide-form dan long-form: satu perbedaan sederhana adalah wide-form menampilkan banyak pengukuran dari satu individu dalam satu baris dan nama kolom menunjukkan apa pengukurannya.

Tabel ini menampilkan tinggi Liam Brown pada tahun 2011-2015 dalam satu baris:

Tabel 06
namegenderyear2011year2012year2013year2014year2015
Liam BrownM88.2496.91101.85108.13112.45

Dalam long-form tinggi Liam Brown ditampilkan dalam satu kolom:

Tabel 07
namegender_
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

Seperti yang Anda lihat, Anda tidak bisa mengetahui pengukuran apa ini. Jika Anda menuliskan nama kolomnya, akan terlihat seperti ini:

Tabel 08
namegenderyear2011, 2012, 2013, 2014, 2015
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

Tetapi ini memiliki masalah tersendiri. Tinggi Sophia Johnson tidak diukur pada tahun 2011-2014. Jadi seperti yang terlihat di bawah, nama kolom tidak dapat ditetapkan dengan mudah:

Tabel 09
namegender?
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82
Sophia JohnsonF76.05

Dari Wide-Form ke Long-Form

Mengonversi wide-form menjadi long-form dapat dipikirkan sebagai proses bertahap. Sebelum mengubah pengukuran dalam satu baris menjadi satu kolom, Anda dapat membuat tabel sedemikian rupa sehingga hanya berisi satu pengukuran di setiap baris. Mari lakukan itu untuk tabel ini:

Tabel 10
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA

Hasilnya seperti tabel di bawah ini:

Tabel 11
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.65  NANANANA
Emma WilliamsF 82.46    NA
Emma WilliamsF  91.76    
Aiden JonesM69.76 NANANANANA
Aiden JonesM 79.89     

Sebelum mengumpulkan pengukuran yang tersebar di berbagai kolom menjadi satu kolom, Anda perlu membuat kolom tambahan yang menyatakan apa pengukuran tersebut, seperti di bawah ini:

Tabel 12
namegendermeasureage0age1age2age3age4age5age6
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46    NA
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

Nama kolom biasanya “measure” atau “key”. Anda dapat melihat pada tabel di atas bahwa terdapat “age0”, “age1”, “age2”, “age3”, “age4”, “age5” baik pada nama kolom maupun satu kolom. Jika Anda menghilangkan nama kolom, tabelnya akan seperti di bawah.

Tabel 13
namegendermeasure____________________________
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46     
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

Karena hanya ada satu pengukuran di setiap baris, Anda dapat mengumpulkannya dalam satu kolom dan hasilnya akan seperti berikut:

Tabel 14
namegendermeasure 
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

Mari buat nama kolom baru untuk semua pengukuran. Biasanya dinamai "value":

Tabel 15
namegendermeasurevalue
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

Perhatikan tabel di atas. Apakah Anda melihat bahwa "age" berulang? Anda dapat menghapus entitas yang berulang, yang akan memberi hasil berikut:

Tabel 16
namegenderagevalue
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

Age yang berulang di setiap baris kini menjadi nama kolom. Nama kolom value pada tabel di atas dapat dibuat lebih spesifik. Anda menggantinya dengan height, yang lebih jelas maknanya. Anda dapat melihat hasilnya pada tabel di bawah:

Tabel 17
namegenderageheight
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

Bandingkan Tabel 15 dengan Tabel 17. value, salah satu nama kolom pada Tabel 15, bisa berarti apa saja, tetapi height pada Tabel 17 memiliki makna yang sangat spesifik: hanya dapat merujuk pada tinggi, sedangkan value pada Tabel 15 bisa berupa nilai apa pun seperti tinggi, berat, kecepatan, atau warna. Cara lain adalah seperti berikut:

Tabel 18
namegendermeasurevalue
Emma WilliamsFheight.age072.65
Emma WilliamsFheight.age182.46
Emma WilliamsFheight.age291.76
Aiden JonesMheight.age069.76
Aiden JonesMheight.age179.89

Pertimbangkan situasi ketika pengukuran beragam. Jika pengukuran mencakup tinggi, berat, dan BMI, hasilnya akan seperti tabel di bawah. Namun dalam kasus ini, kolom value berisi nilai numerik dengan skala berbeda sehingga bisa membingungkan saat membacanya. Pada tabel ini, tinggi diukur dalam sentimeter, dan berat dalam kilogram:

Tabel 19
namegendermeasurevalue
Emma WilliamsFheight72.65
Emma WilliamsFweight8.22
Emma WilliamsFBMI22.60
Aiden JonesMheight69.76
Aiden JonesMweight8.51

Jadi ketika mengonversi wide-form ke long-form, seseorang perlu memutuskan nilai mana yang akan dikumpulkan ke dalam satu kolom. Setelah itu, Anda dapat menentukan nama kolomnya.

Mari merangkum apa yang telah disampaikan sejauh ini: untuk mengonversi wide-form menjadi long-form, Anda perlu memutuskan kolom mana yang akan diubah sehingga berada dalam satu kolom. Saat melakukannya, banyak kolom digabungkan menjadi satu kolom. Jadi Anda memerlukan nama kolom untuk kolom tersebut, seperti yang dapat Anda lihat pada tabel berikut:

Tabel 20
id1id2age0age1age2
Emma WilliamsFNA82.4691.76
Aiden JonesM69.7679.89NA
Emma WilliamsFNA82.4691.76
Tabel 21
id1id2age0age1age2
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Aiden JonesM69.76  
Aiden JonesM 79.89 
Aiden JonesM  NA
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Tabel 22
id1id2age_age0age1age2
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Aiden JonesMage069.76  
Aiden JonesMage1 79.89 
Aiden JonesMage2  NA
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Tabel 23
id1id2age_ 
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tabel 24
id1id2keyvalue
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tabel 25
id1id2keyvalue
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Emma WilliamsFage182.46
Emma WilliamsFage291.76

Perhatikan kolom id1 dan id2 pada tabel di atas. id2 tidak menentukan individu, melainkan atribut (jenis kelamin) dari individu. Dengan kata lain, Anda dapat mengatakan itu adalah pengukuran. Jadi Anda dapat mengonversinya ke bentuk yang lebih long. Bentuk paling long terdiri dari tiga kolom, yaitu id, key dan value.

Tabel 26
idkeyvalue
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76
Aiden JonesgenderF
Aiden Jonesage069.76
Aiden Jonesage179.89
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76

Tabel di atas menunjukkan bentuk paling long dari tabel 25. Namun orang yang berbeda bisa memiliki nama yang sama.

Dalam kasus itu, long-form bisa membingungkan karena id tidak dapat menentukan satu orang. Anda dapat menambahkan angka di belakang nama untuk membedakan orang (misalnya, menggunakan fungsi R make.unique()), tetapi Anda tidak dapat membedakan nama yang diubah dan nama asli yang memang bernomor. Bayangkan seseorang yang namanya benar-benar "John.2"!

Cara yang jelas untuk mengatasinya adalah menetapkan nomor ID berbeda untuk orang yang berbeda. Dalam hal ini, nama menjadi pengukuran lain.

Tabel berikut menunjukkan bahwa bahkan nama dianggap sebagai pengukuran. Dalam arti tertentu, inilah bentuk paling long yang sesungguhnya.

Tabel 27
idkeyvalue
1nameEmma Williams
1genderF
1age182.46
1age291.76
2nameAiden Jones
2genderF
2age069.76
2age179.89
3nameEmma Williams
3genderF
3age182.46
3age291.76

Bentuk paling long adalah bentuk termudah untuk membuat wide-form. Jika Anda membalik proses konversi wide-form ke long-form yang ditunjukkan pada tabel 20 hingga 25, Anda akan mendapatkan wide-form. Tabel-tabel berikut menunjukkan proses ini:

Tabel 28. Pengukuran di kolom key diulang pada nama kolom
idkeynamegenderage0age1age2
1nameEmma Williams    
1gender F   
1age1   82.46 
1age2    91.76
2nameAiden Jones    
2gender F   
2age0  69.76  
2age1   79.89 
3nameEmma Williams    
3gender F   
3age1   82.46 
3age2    91.76
Tabel 29. Kolom key dapat dihapus
idnamegenderage0age1age2
1Emma Williams    
1 F   
1   82.46 
1    91.76
2Aiden Jones    
2 F   
2  69.76  
2   79.89 
3Emma Williams    
3 F   
3   82.46 
3    91.76
Tabel 30. id yang sama dapat dikumpulkan dalam satu baris
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
1     
1     
1     
2Aiden JonesF69.7679.89 
2     
2     
2     
3Emma WilliamsF 82.4691.76
3     
3     
3     
Tabel 31. Hapus baris apa pun yang tidak memiliki pengukuran
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
2Aiden JonesF69.7679.89 
3Emma WilliamsF 82.4691.76

Faktor kunci dalam mengonversi wide-form menjadi long-form adalah memutuskan kolom mana yang akan dikumpulkan menjadi satu kolom.

Namun tidak harus hanya satu kolom. Anda bisa menggunakan dua kolom jika perlu, seperti pada tabel di bawah ini:

Tabel 32
namegenderh2011h2012w2011w2012
Jackson SmithM74.6984.999.6012.0
Olivia MillerFNA80.767.1510.7
Ava WilsonF88.7796.45NA15.0

Dapatkah Anda mengubahnya menjadi long-form?

Kolom h2011, h2012, w2011, w2012 berarti tinggi dan berat pada tahun 2011 dan 2012. height dan weight diukur dalam skala berbeda — cm, kg. Jadi Anda dapat menggunakan satu kolom saja untuk tinggi dan berat atau Anda dapat menggunakan dua kolom, seperti pada tabel ini:

Tabel 33
namegenderyearheightweight
Jackson SmithM201174.699.60
Jackson SmithM201284.9912.00
Olivia MillerF2011NA80.76
Olivia MillerF20127.1510.70
Ava WilsonF201188.7796.45
Ava WilsonF2012NA15.00

Apakah ini long-form atau wide-form?

Dari Long ke Wide Data di R

Mari lakukan konversi antara long-form dan wide-form dengan R. Ada banyak fungsi dan paket yang tersedia untuk tugas ini.

Tabel 34
funcpackageto_long_formto_wide_form
stack/unstackutilsstackunstack
reshapestatsreshape(direction="long", ...)reshape(direction="wide", ...)
melt/dcastreshape2meltdcast
gather/spreadtidyrgatherspread

Di sini saya akan menjelaskan cara menggunakan fungsi melt() dan dcast() dari paket reshape2. Alasannya adalah stack() dan unstack() adalah fungsi dasar sehingga hasilnya perlu diproses lanjutan. Perlu dicatat bahwa gather() dan spread() adalah fungsi tidyr yang juga sangat populer, tetapi tidak akan dibahas dalam tutorial ini.

Fungsi lain yang mungkin dapat Anda gunakan adalah reshape() dari paket stats. Sebenarnya, jangan bingung dengan fungsi ini, karena ada juga paket bernama reshape! Paket ini, bersama dengan reshape2, dikembangkan untuk mereka yang kesulitan dengan reshape(). Selain itu, fungsi reshape() tampaknya memiliki asumsi bahwa datanya longitudinal, yang berarti pengukuran diulang seiring waktu.

Mari konversi data pada tabel 35 ke long-form. Misalkan tabel di bawah menyimpan sebuah data.frame bernama dat.

Tabel 35
namegenderyear2011year2012year2013
Jackson SmithM74.6984.9991.73
Emma WilliamsFNANA75.74
Liam BrownM88.24NA101.85
Ava WilsonF88.7796.45NA

babies = data.frame(name= c("Jackson Smith", "Emma Williams", "Liam Brown", "Ava Wilson"), gender = c("M", "F", "M", "F"), year2011= c(74.69, NA, 88.24, 88.77), year2012=c(84.99, NA, NA, 96.45), year2013=c(91.73, 75.74, 101.83, NA)) babies

##            name gender year2011 year2012 year2013
## 1 Jackson Smith      M    74.69    84.99    91.73
## 2 Emma Williams      F       NA       NA    75.74
## 3    Liam Brown      M    88.24       NA   101.83
## 4    Ava Wilson      F    88.77    96.45       NA

Pertanyaan yang ingin Anda ajukan adalah: "kolom mana yang akan digabungkan menjadi satu kolom?".

Itu adalah year2011, year2012, year2013. Saat Anda menggunakan fungsi melt(), kolom-kolom tersebut harus dicantumkan untuk measure.vars:

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

year2011, year2012, year2013 berada pada kolom ke-3, ke-4, ke-5 jadi Anda dapat menggunakan itu:

melt(babies, measure.vars = 3:5)

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

Hasilnya ada pada tabel di atas. Perhatikan nama kolom variable dan value. Tabel 23 dan tabel 24 menunjukkan bahwa nama kolom baru diperlukan. Fungsi melt() memiliki nama baku untuk kolom baru — variable dan value. Anda dapat menimpa nilai baku dengan argumen variable.name= dan value.name=. Mari lakukan di bawah ini:

melt(babies, measure.vars=3:5, variable.name="year", value.name="height")

##             name gender     year height
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

Pengukuran ditentukan pada contoh di atas. Untuk setelan yang Anda tangani, Id dapat secara tidak langsung menentukan pengukuran. Jadi Anda dapat memilih kolom untuk id alih-alih pengukuran.

Hasilnya sama untuk keduanya di bawah ini. Yang pertama memilih kolom untuk id, yang kedua memilih kolom yang akan dikumpulkan:

melt(babies, id.vars=c("name","gender"))

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

Jika Anda menentukan id.vars dan measure.vars sekaligus, kolom yang tidak termasuk keduanya dikecualikan dari hasil. Misalnya, lihat potongan kode di bawah ini:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"))

##            name variable value
## 1 Jackson Smith year2011 74.69
## 2 Emma Williams year2011    NA
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 6 Emma Williams year2012    NA
## 7    Liam Brown year2012    NA
## 8    Ava Wilson year2012 96.45

Selain itu, na.rm=T dapat menghapus NA:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

Fungsi dcast() melakukan kebalikan dari melt(). id, variable, dan value adalah kolom pada bentuk paling long. dcast(data, id ~ variable, value.var="value") mengubah bentuk paling long menjadi wide-form.

babiesLong <- melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)
babiesLong

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

babiesLong memiliki name untuk id, variable untuk variable, dan value untuk value. Jadi Anda dapat menggunakan dcast() untuk membuatnya menjadi long-form:

dcast(babiesLong, name ~ variable, value.var="value")

##            name year2011 year2012
## 1    Ava Wilson    88.77    96.45
## 2 Jackson Smith    74.69    84.99
## 3    Liam Brown    88.24       NA

Kesimpulan

Sekian. Dalam tutorial ini, Anda berfokus pada pemahaman logika dan proses pembentukan ulang data. Biasanya, long-form lebih disukai untuk analisis tetapi ada pengecualian. Penyajian data dalam wide-form dapat menghemat ruang ketika sesuai, namun ketika jumlah nilai hilang meningkat, sebaiknya Anda mengonversinya ke long-form.

Untuk konversi format, Anda perlu berfokus pada apa yang menjadi pengukuran. Moto untuk long-form adalah satu pengukuran per satu baris dan wide-form memiliki banyak pengukuran dalam satu baris. Ketika Anda mengumpulkan pengukuran di berbagai kolom menjadi satu kolom, nama kolom asli perlu dipertahankan dalam satu kolom tambahan. Ketika Anda menyebarkan pengukuran dalam satu kolom ke berbagai kolom, Anda perlu menentukan apa nama kolomnya dari kolom variable.

Setelah Anda memahami prosesnya, menggunakan fungsi seperti dcast() dan melt() menjadi jauh lebih mudah!

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026