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
name
gender
year2011
year2012
year2013
year2014
year2015
Jackson Smith
M
74.69
84.99
91.73
105.11
111.04
Sophia Johnson
F
NA
NA
NA
NA
75.89
Emma Williams
F
NA
NA
75.74
86.50
91.50
Aiden Jones
M
NA
NA
NA
71.89
81.42
Liam Brown
M
88.24
96.91
101.85
108.13
112.45
Lucas Davis
M
70.60
83.78
94.17
100.03
106.35
Olivia Miller
F
64.78
80.76
87.30
97.13
103.80
Ava Wilson
F
88.77
96.45
104.72
112.84
NA
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
name
gender
age0
age1
age2
age3
age4
age5
age6
Jackson Smith
M
NA
76.69
84.91
97.06
105.73
107.32
NA
Sophia Johnson
F
NA
76.05
NA
NA
NA
NA
NA
Emma Williams
F
72.65
82.46
91.76
NA
NA
NA
NA
Aiden Jones
M
69.76
79.89
NA
NA
NA
NA
NA
Liam Brown
M
NA
NA
85.34
93.22
105.78
105.84
114.82
Lucas Davis
M
71.59
84.87
92.10
100.73
104.21
NA
NA
Olivia Miller
F
62.74
81.39
92.02
98.32
106.44
NA
NA
Ava Wilson
F
NA
NA
88.39
100.67
107.58
111.52
NA
Jumlah NA bertambah. ## Data Bentuk Wide Namun bagaimana jika Anda ingin menyampaikan berapa bulan usia seorang bayi? Itu akan terlihat seperti ini:
Tabel 03
name
gender
m4
m6
m7
m10
m12
...
m55
m60
m65
m72
Jackson Smith
M
NA
NA
NA
NA
76.69
...
NA
107.32
NA
NA
Sophia Johnson
F
NA
NA
NA
NA
76.05
...
NA
NA
NA
NA
Emma Williams
F
NA
NA
NA
72.65
NA
...
NA
NA
NA
NA
Aiden Jones
M
NA
69.76
NA
NA
NA
...
NA
NA
NA
NA
Liam Brown
M
NA
NA
NA
NA
NA
...
NA
105.84
NA
114.82
Lucas Davis
M
NA
NA
71.59
NA
NA
...
104.21
NA
NA
NA
Olivia Miller
F
62.74
NA
NA
NA
NA
...
NA
NA
NA
NA
Ava Wilson
F
NA
NA
NA
NA
NA
...
NA
NA
111.52
NA
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
name
gender
month
height
Olivia Miller
F
4
62.74
Aiden Jones
M
6
69.76
Lucas Davis
M
7
71.59
Emma Williams
F
10
72.65
Jackson Smith
M
12
76.69
...
...
...
...
Liam Brown
M
72
114.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
name
gender
month
height
Jackson Smith
M
12
76.69
Jackson Smith
M
24
84.91
Jackson Smith
M
36
97.06
Jackson Smith
M
48
105.73
Jackson Smith
M
60
107.32
Sophia Johnson
F
12
76.05
Emma Williams
F
10
72.65
...
...
...
...
Ava Wilson
F
65
111.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
name
gender
year2011
year2012
year2013
year2014
year2015
Liam Brown
M
88.24
96.91
101.85
108.13
112.45
Dalam long-form tinggi Liam Brown ditampilkan dalam satu kolom:
Tabel 07
name
gender
_
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.82
Seperti yang Anda lihat, Anda tidak bisa mengetahui pengukuran apa ini. Jika Anda menuliskan nama kolomnya, akan terlihat seperti ini:
Tabel 08
name
gender
year2011, 2012, 2013, 2014, 2015
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.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
name
gender
?
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.82
Sophia Johnson
F
76.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
name
gender
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
72.65
82.46
91.76
NA
NA
NA
NA
Aiden Jones
M
69.76
79.89
NA
NA
NA
NA
NA
Hasilnya seperti tabel di bawah ini:
Tabel 11
name
gender
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
72.65
NA
NA
NA
NA
Emma Williams
F
82.46
NA
Emma Williams
F
91.76
Aiden Jones
M
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
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
name
gender
measure
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
age0
72.65
NA
NA
NA
NA
Emma Williams
F
age1
82.46
NA
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
age1
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
name
gender
measure
_
__
___
____
_____
______
_______
Emma Williams
F
age0
72.65
NA
NA
NA
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
age1
79.89
Karena hanya ada satu pengukuran di setiap baris, Anda dapat mengumpulkannya dalam satu kolom dan hasilnya akan seperti berikut:
Tabel 14
name
gender
measure
Emma Williams
F
age0
72.65
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Mari buat nama kolom baru untuk semua pengukuran. Biasanya dinamai "value":
Tabel 15
name
gender
measure
value
Emma Williams
F
age0
72.65
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Perhatikan tabel di atas. Apakah Anda melihat bahwa "age" berulang? Anda dapat menghapus entitas yang berulang, yang akan memberi hasil berikut:
Tabel 16
name
gender
age
value
Emma Williams
F
0
72.65
Emma Williams
F
1
82.46
Emma Williams
F
2
91.76
Aiden Jones
M
0
69.76
Aiden Jones
M
1
79.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
name
gender
age
height
Emma Williams
F
0
72.65
Emma Williams
F
1
82.46
Emma Williams
F
2
91.76
Aiden Jones
M
0
69.76
Aiden Jones
M
1
79.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
name
gender
measure
value
Emma Williams
F
height.age0
72.65
Emma Williams
F
height.age1
82.46
Emma Williams
F
height.age2
91.76
Aiden Jones
M
height.age0
69.76
Aiden Jones
M
height.age1
79.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
name
gender
measure
value
Emma Williams
F
height
72.65
Emma Williams
F
weight
8.22
Emma Williams
F
BMI
22.60
Aiden Jones
M
height
69.76
Aiden Jones
M
weight
8.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
id1
id2
age0
age1
age2
Emma Williams
F
NA
82.46
91.76
Aiden Jones
M
69.76
79.89
NA
Emma Williams
F
NA
82.46
91.76
Tabel 21
id1
id2
age0
age1
age2
Emma Williams
F
NA
Emma Williams
F
82.46
Emma Williams
F
91.76
Aiden Jones
M
69.76
Aiden Jones
M
79.89
Aiden Jones
M
NA
Emma Williams
F
NA
Emma Williams
F
82.46
Emma Williams
F
91.76
Tabel 22
id1
id2
age_
age0
age1
age2
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tabel 23
id1
id2
age_
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tabel 24
id1
id2
key
value
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tabel 25
id1
id2
key
value
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.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
id
key
value
Emma Williams
gender
F
Emma Williams
age1
82.46
Emma Williams
age2
91.76
Aiden Jones
gender
F
Aiden Jones
age0
69.76
Aiden Jones
age1
79.89
Emma Williams
gender
F
Emma Williams
age1
82.46
Emma Williams
age2
91.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
id
key
value
1
name
Emma Williams
1
gender
F
1
age1
82.46
1
age2
91.76
2
name
Aiden Jones
2
gender
F
2
age0
69.76
2
age1
79.89
3
name
Emma Williams
3
gender
F
3
age1
82.46
3
age2
91.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
id
key
name
gender
age0
age1
age2
1
name
Emma Williams
1
gender
F
1
age1
82.46
1
age2
91.76
2
name
Aiden Jones
2
gender
F
2
age0
69.76
2
age1
79.89
3
name
Emma Williams
3
gender
F
3
age1
82.46
3
age2
91.76
Tabel 29. Kolom key dapat dihapus
id
name
gender
age0
age1
age2
1
Emma Williams
1
F
1
82.46
1
91.76
2
Aiden Jones
2
F
2
69.76
2
79.89
3
Emma Williams
3
F
3
82.46
3
91.76
Tabel 30. id yang sama dapat dikumpulkan dalam satu baris
id
name
gender
age0
age1
age2
1
Emma Williams
F
82.46
91.76
1
1
1
2
Aiden Jones
F
69.76
79.89
2
2
2
3
Emma Williams
F
82.46
91.76
3
3
3
Tabel 31. Hapus baris apa pun yang tidak memiliki pengukuran
id
name
gender
age0
age1
age2
1
Emma Williams
F
82.46
91.76
2
Aiden Jones
F
69.76
79.89
3
Emma Williams
F
82.46
91.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
name
gender
h2011
h2012
w2011
w2012
Jackson Smith
M
74.69
84.99
9.60
12.0
Olivia Miller
F
NA
80.76
7.15
10.7
Ava Wilson
F
88.77
96.45
NA
15.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
name
gender
year
height
weight
Jackson Smith
M
2011
74.69
9.60
Jackson Smith
M
2012
84.99
12.00
Olivia Miller
F
2011
NA
80.76
Olivia Miller
F
2012
7.15
10.70
Ava Wilson
F
2011
88.77
96.45
Ava Wilson
F
2012
NA
15.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
func
package
to_long_form
to_wide_form
stack/unstack
utils
stack
unstack
reshape
stats
reshape(direction="long", ...)
reshape(direction="wide", ...)
melt/dcast
reshape2
melt
dcast
gather/spread
tidyr
gather
spread
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.
## name gender year2011 year2012 year2013
## 1 Jackson Smith M74.6984.9991.73
## 2 Emma Williams FNANA75.74
## 3 Liam Brown M88.24NA101.83
## 4 Ava Wilson F88.7796.45NADidukung oleh
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 NADidukung oleh
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 NADidukung oleh
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 NADidukung oleh
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 NADidukung oleh
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.45Didukung oleh
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.45Didukung oleh
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.45Didukung oleh
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.7796.45
## 2 Jackson Smith 74.6984.99
## 3 Liam Brown 88.24NADidukung oleh
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!
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
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 sepertimosaicplot(). 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:
melt()dandcast().Data
Tabel ini menunjukkan tinggi badan bayi di suatu wilayah kecil. Tinggi diukur dari tahun 2011 hingga 2015. Seperti yang mungkin sudah Anda ketahui,
NAberarti ‘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:Jumlah
NAbertambah. ## Data Bentuk Wide Namun bagaimana jika Anda ingin menyampaikan berapa bulan usia seorang bayi? Itu akan terlihat seperti ini:Terdapat banyak
NApada 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: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!
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:
Dalam long-form tinggi Liam Brown ditampilkan dalam satu kolom:
Seperti yang Anda lihat, Anda tidak bisa mengetahui pengukuran apa ini. Jika Anda menuliskan nama kolomnya, akan terlihat seperti ini:
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:
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:
Hasilnya seperti tabel di bawah ini:
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:
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.Karena hanya ada satu pengukuran di setiap baris, Anda dapat mengumpulkannya dalam satu kolom dan hasilnya akan seperti berikut:
Mari buat nama kolom baru untuk semua pengukuran. Biasanya dinamai "value":
Perhatikan tabel di atas. Apakah Anda melihat bahwa "age" berulang? Anda dapat menghapus entitas yang berulang, yang akan memberi hasil berikut:
Ageyang berulang di setiap baris kini menjadi nama kolom. Nama kolomvaluepada tabel di atas dapat dibuat lebih spesifik. Anda menggantinya denganheight, yang lebih jelas maknanya. Anda dapat melihat hasilnya pada tabel di bawah:Bandingkan Tabel 15 dengan Tabel 17.
value, salah satu nama kolom pada Tabel 15, bisa berarti apa saja, tetapiheightpada 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:Pertimbangkan situasi ketika pengukuran beragam. Jika pengukuran mencakup tinggi, berat, dan BMI, hasilnya akan seperti tabel di bawah. Namun dalam kasus ini, kolom
valueberisi nilai numerik dengan skala berbeda sehingga bisa membingungkan saat membacanya. Pada tabel ini, tinggi diukur dalam sentimeter, dan berat dalam kilogram: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:
Perhatikan kolom
id1danid2pada tabel di atas.id2tidak 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, yaituid,keydanvalue.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
idtidak dapat menentukan satu orang. Anda dapat menambahkan angka di belakang nama untuk membedakan orang (misalnya, menggunakan fungsi Rmake.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.
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:
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:
Dapatkah Anda mengubahnya menjadi long-form?
Kolom
h2011,h2012,w2011,w2012berarti tinggi dan berat pada tahun 2011 dan 2012.heightdanweightdiukur 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: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.
Di sini saya akan menjelaskan cara menggunakan fungsi
melt()dandcast()dari paketreshape2. Alasannya adalahstack()danunstack()adalah fungsi dasar sehingga hasilnya perlu diproses lanjutan. Perlu dicatat bahwagather()danspread()adalah fungsitidyryang juga sangat populer, tetapi tidak akan dibahas dalam tutorial ini.Fungsi lain yang mungkin dapat Anda gunakan adalah
reshape()dari paketstats. Sebenarnya, jangan bingung dengan fungsi ini, karena ada juga paket bernamareshape! Paket ini, bersama denganreshape2, dikembangkan untuk mereka yang kesulitan denganreshape(). Selain itu, fungsireshape()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.framebernamadat.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
Pertanyaan yang ingin Anda ajukan adalah: "kolom mana yang akan digabungkan menjadi satu kolom?".
Itu adalah
year2011,year2012,year2013. Saat Anda menggunakan fungsimelt(), kolom-kolom tersebut harus dicantumkan untukmeasure.vars:year2011,year2012,year2013berada pada kolom ke-3, ke-4, ke-5 jadi Anda dapat menggunakan itu:Hasilnya ada pada tabel di atas. Perhatikan nama kolom
variabledanvalue. Tabel 23 dan tabel 24 menunjukkan bahwa nama kolom baru diperlukan. Fungsimelt()memiliki nama baku untuk kolom baru —variabledanvalue. Anda dapat menimpa nilai baku dengan argumenvariable.name=danvalue.name=. Mari lakukan di bawah ini:Pengukuran ditentukan pada contoh di atas. Untuk setelan yang Anda tangani,
Iddapat 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:
Jika Anda menentukan
id.varsdanmeasure.varssekaligus, kolom yang tidak termasuk keduanya dikecualikan dari hasil. Misalnya, lihat potongan kode di bawah ini:Selain itu,
na.rm=Tdapat menghapus NA:Fungsi
dcast()melakukan kebalikan darimelt().id,variable, danvalueadalah kolom pada bentuk paling long.dcast(data, id ~ variable, value.var="value")mengubah bentuk paling long menjadi wide-form.babiesLongmemiliki name untukid, variable untukvariable, dan value untukvalue. Jadi Anda dapat menggunakandcast()untuk membuatnya menjadi long-form: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()danmelt()menjadi jauh lebih mudah!