Saya memiliki beberapa masalah untuk mengkonversi data.frame
dari tabel lebar ke meja panjang. Saat ini terlihat seperti ini:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Sekarang saya ingin mengubah ini data.frame
menjadi panjang data.frame
. Sesuatu seperti ini:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Saya telah melihat dan sudah mencoba menggunakan melt()
dan reshape()
fungsinya karena beberapa orang menyarankan dalam pertanyaan serupa. Namun, sejauh ini saya hanya mendapatkan hasil yang berantakan.
Jika mungkin saya ingin melakukannya dengan reshape()
fungsi karena terlihat sedikit lebih baik untuk ditangani.
Jawaban:
reshape()
perlu waktu untuk terbiasa, sama sepertimelt
/cast
. Ini adalah solusi dengan membentuk kembali, dengan asumsi frame data Anda disebutd
:sumber
Tiga solusi alternatif:
1) Dengan tabel data:
Anda dapat menggunakan
melt
fungsi yang sama seperti dalamreshape2
paket (yang merupakan implementasi yang diperluas & ditingkatkan).melt
fromdata.table
juga memiliki lebih banyak parameter darimelt
-fungsireshape2
. Misalnya, Anda juga dapat menentukan nama kolom-variabel:pemberian yang mana:
Beberapa notasi alternatif:
2) Dengan rapi:
Beberapa notasi alternatif:
3) Dengan membentuk kembali2:
Beberapa notasi alternatif yang memberikan hasil yang sama:
CATATAN:
NA
nilai, Anda dapat menambahkanna.rm = TRUE
kemelt
sertagather
fungsi.Masalah lain dengan data adalah bahwa nilai akan dibaca oleh R sebagai nilai karakter (sebagai akibat dari
,
angka-angka). Anda dapat memperbaikinya dengangsub
danas.numeric
:Atau langsung dengan
data.table
ataudplyr
:Data:
sumber
id
dantime
dalam bingkai data Anda,melt
tidak bisa memberi tahu apa yang ingin Anda lakukan dalam kasus ini.id.vars
danmeasure.vars
.id.vars
danmeasure.vars
dapat ditentukan dalam alternatif pertama, maaf untuk kekacauan, ini salahku.-c(var1, var2)
...-c(var1, var2)
menghapus variabel-variabel ini ketika mengubah data dari format lebar ke panjang.Menggunakan paket membentuk kembali :
sumber
Dengan
tidyr_1.0.0
, opsi lain adalahpivot_longer
data
sumber
gather
sedang pensiun danpivot_longer
sekarang cara yang tepat untuk mencapai ini.Karena jawaban ini ditandai dengan r-faq, Saya merasa itu akan berguna untuk berbagi alternatif lain dari basis R:
stack
.Catatan, bagaimanapun, itu
stack
tidak bekerja denganfactor
s - hanya berfungsi jikais.vector
adaTRUE
, dan dari dokumentasi untukis.vector
, kami menemukan bahwa:Saya menggunakan data sampel dari jawaban @ Jaap , di mana nilai dalam kolom tahun adalah
factor
s.Inilah
stack
pendekatannya:sumber
Berikut adalah contoh lain yang menunjukkan penggunaan
gather
daritidyr
. Anda dapat memilih kolom untukgather
menghapusnya satu per satu (seperti yang saya lakukan di sini), atau dengan memasukkan tahun yang Anda inginkan secara eksplisit.Perhatikan bahwa, untuk menangani koma (dan X ditambahkan jika
check.names = FALSE
tidak disetel), saya juga menggunakandplyr
mutasi denganparse_number
darireadr
untuk mengubah nilai teks kembali ke angka. Ini semua adalah bagian daritidyverse
dan jadi dapat dimuat bersamalibrary(tidyverse)
Pengembalian:
sumber
Ini a sqldf larutan:
Untuk membuat kueri tanpa mengetik semuanya, Anda dapat menggunakan yang berikut ini:
Terima kasih kepada G. Grothendieck untuk menerapkannya.
Sayangnya, saya tidak memikirkan itu
PIVOT
danUNPIVOT
akan berhasilR
SQLite
. Jika Anda ingin menulis kueri Anda dengan cara yang lebih canggih, Anda juga dapat melihat posting ini:Menggunakan
sprintf
penulisan kueri sql Atau Lulus variabel kesqldf
sumber
Anda juga dapat menggunakan
cdata
paket, yang menggunakan konsep tabel kontrol (transformasi):Saya sedang mengeksplorasi paket itu dan merasa cukup mudah diakses. Ia dirancang untuk transformasi yang jauh lebih rumit dan mencakup transformasi balik. Ada tutorial yang tersedia.
sumber