Saya memiliki daftar data bersarang. Panjangnya adalah 132 dan setiap item adalah daftar panjangnya 20. Apakah ada cara cepat untuk mengubah struktur ini menjadi kerangka data yang memiliki 132 baris dan 20 kolom data?
Berikut ini beberapa contoh data untuk digunakan:
l <- replicate(
132,
list(sample(letters, 20)),
simplify = FALSE
)
Jawaban:
Dengan asumsi daftar daftar Anda disebut
l
:Di atas akan mengkonversi semua kolom karakter ke faktor, untuk menghindari ini, Anda dapat menambahkan parameter ke panggilan data.frame ():
sumber
Dengan
rbind
Edit: Sebelumnya versi kembali
data.frame
darilist
's bukan vektor (seperti @IanSudbery ditunjukkan dalam komentar).sumber
rbind(your_list)
mengembalikan matriks daftar 1x32?do.call
meneruskan elemenyour_list
sebagai argumen kerbind
. Ini setara denganrbind(your_list[[1]], your_list[[2]], your_list[[3]], ....., your_list[[length of your_list]])
.your_list
mengandung vektor berukuran sama.NULL
memiliki panjang 0 sehingga harus gagal.Anda bisa menggunakan
plyr
paket. Misalnya daftar formulir yang bersarangsekarang memiliki panjang 4 dan masing-masing daftar di
l
berisi daftar panjang lainnya 3. Sekarang Anda dapat menjalankandan harus mendapatkan hasil yang sama seperti pada jawaban @Marek dan @nico.
sumber
matrix
pendekatan.data.frame(t(sapply(mylistlist,c)))
sapply
mengubahnya menjadi sebuah matriks.data.frame
mengkonversi matriks ke bingkai data.sumber
c
mainkan di sini, satu contoh dari data daftar? Oh, tunggu, c untuk fungsi gabungan, kan? Menjadi bingung dengan penggunaan @ mnel tentang c. Saya juga setuju dengan @dchandler, mendapatkan nama kolom yang benar adalah kebutuhan yang berharga dalam kasus penggunaan saya. Solusi brilian.?c
:Combine Values into a Vector or List
anggap daftar Anda dipanggil
L
,sumber
data.frame(Reduce(rbind, list(c('col1','col2'))))
menghasilkan bingkai data dengan 2 baris, 1 kolom (saya harapkan 1 baris 2 kolom)Paket ini
data.table
memiliki fungsirbindlist
yang merupakan implementasi supercepat darido.call(rbind, list(...))
.Dapat mengambil daftar
lists
,data.frames
ataudata.tables
sebagai masukan.Ini mengembalikan
data.table
warisan daridata.frame
.Jika Anda benar - benar ingin mengonversi kembali ke penggunaan data.frame
as.data.frame(DT)
sumber
setDF
sekarang memungkinkan untuk kembali ke data.frame dengan referensi.The
tibble
paket memiliki fungsienframe()
yang memecahkan masalah ini dengan memaksa bersaranglist
objek untuk bersarangtibble
( "rapi" frame data) obyek. Berikut adalah contoh singkat dari R untuk Ilmu Data :Karena Anda memiliki beberapa sarang dalam daftar,
l
Anda dapat menggunakanunlist(recursive = FALSE)
untuk menghapus sarang yang tidak perlu untuk mendapatkan hanya satu daftar hierarkis dan kemudian lolosenframe()
. Saya gunakantidyr::unnest()
untuk mem-undest output menjadi kerangka data "rapi" tingkat tunggal, yang memiliki dua kolom Anda (satu untuk grupname
dan satu untuk pengamatan dengan grupvalue
). Jika Anda ingin kolom yang lebar, Anda bisa menambahkan kolom menggunakanadd_column()
yang hanya mengulangi urutan nilai 132 kali. Kemudian hanyaspread()
nilainya.sumber
Bergantung pada struktur daftar Anda, ada beberapa
tidyverse
opsi yang berfungsi baik dengan daftar panjang yang tidak sama:Anda juga dapat mencampur vektor dan bingkai data:
sumber
X2
tidak dapat dikonversi dari integer ke karakterMembentuk ulang2 menghasilkan output yang sama seperti contoh plyr di atas:
hasil:
Jika Anda hampir kehabisan piksel, Anda dapat melakukan ini semua dalam 1 baris dengan pemasangan ulang ().
sumber
Metode ini menggunakan
tidyverse
paket ( purrr ).Daftar:
Mengubahnya menjadi bingkai data (
tibble
lebih khusus):sumber
Memperluas pada jawaban @ Marek: jika Anda ingin menghindari string yang akan berubah menjadi faktor dan efisiensi bukan masalah coba
sumber
Untuk kasus umum daftar bersarang dalam dengan 3 level atau lebih seperti yang diperoleh dari JSON bersarang:
pertimbangkan pendekatan
melt()
untuk mengonversi daftar bersarang ke format tinggi terlebih dahulu:diikuti
dcast()
kemudian untuk melebar lagi ke dataset rapi di mana setiap variabel membentuk kolom dan setiap pengamatan membentuk satu baris:sumber
Lebih banyak jawaban, bersama dengan waktu dalam jawaban untuk pertanyaan ini: Apa cara paling efisien untuk melemparkan daftar sebagai kerangka data?
Cara tercepat, yang tidak menghasilkan kerangka data dengan daftar daripada vektor untuk kolom tampaknya (dari jawaban Martin Morgan):
sumber
Terkadang data Anda mungkin merupakan daftar daftar vektor dengan panjang yang sama.
(Vektor dalam juga bisa berupa daftar, tapi saya menyederhanakan untuk membuatnya lebih mudah dibaca).
Kemudian Anda dapat melakukan modifikasi berikut. Ingatlah bahwa Anda dapat membatalkan pendaftaran satu tingkat pada satu waktu:
Sekarang gunakan metode favorit Anda yang disebutkan dalam jawaban lain:
sumber
Inilah yang akhirnya berhasil untuk saya:
do.call("rbind", lapply(S1, as.data.frame))
sumber
sumber
Untuk solusi paralel (multicore, multisession, dll) menggunakan
purrr
keluarga solusi, gunakan:Dimana
l
daftarnya.Untuk benchmark yang paling efisien,
plan()
Anda dapat menggunakan:sumber
Perintah sederhana berikut ini bekerja untuk saya:
Referensi ( Jawaban quora )
Tetapi ini akan gagal jika tidak jelas cara mengonversi daftar menjadi bingkai data:
Catatan : Jawabannya mengarah ke judul pertanyaan dan dapat melompati beberapa detail pertanyaan
sumber
Cara pendek (tapi mungkin bukan yang tercepat) untuk melakukan ini adalah dengan menggunakan basis r, karena bingkai data hanyalah daftar vektor dengan panjang yang sama . Dengan demikian konversi antara daftar input Anda dan data.frame 30 x 132 adalah:
Dari sana kita dapat memindahkannya ke matriks 132 x 30, dan mengubahnya kembali menjadi kerangka data:
Sebagai one-liner:
Rownames akan sangat mengganggu untuk dilihat, tetapi Anda selalu bisa mengganti nama dengan
rownames(new_df) <- 1:nrow(new_df)
sumber
Bagaimana kalau menggunakan
map_
fungsi bersamaan dengan satufor
loop? Inilah solusi saya:di mana
map_dfr
mengkonversi masing-masing elemen daftar ke dalam data.frame dan kemudian persatukanrbind
semuanya.Dalam kasus Anda, saya kira itu akan:
sumber