Saya memiliki data.frame yang ingin saya ubah menjadi daftar per baris, yang berarti setiap baris akan sesuai dengan elemen daftarnya sendiri. Dengan kata lain, saya ingin daftar yang sepanjang data.frame memiliki baris.
Sejauh ini, saya telah mengatasi masalah ini dengan cara berikut, tetapi saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini.
xy.df <- data.frame(x = runif(10), y = runif(10))
# pre-allocate a list and fill it with a loop
xy.list <- vector("list", nrow(xy.df))
for (i in 1:nrow(xy.df)) {
xy.list[[i]] <- xy.df[i,]
}
split
setiap elemen memiliki jenisdata.frame with 1 rows and N columns
alih-alihlist of length N
split
Anda mungkin harus melakukandrop=T
sebaliknya tingkat asli Anda untuk faktor tidak akan turunEureka!
sumber
unlist(apply(xy.df, 1, list), recursive = FALSE)
. Namun solusi flodel lebih efisien daripada menggunakanapply
ataut
.t
mengonversidata.fame
ke amatrix
sehingga elemen dalam daftar Anda adalah vektor atom, bukan daftar seperti yang diminta OP. Ini biasanya tidak menjadi masalah sampai Andaxy.df
berisi jenis campuran ...apply
. Ini sebenarnya hanya untuk perulangan yang diimplementasikan di R.lapply
melakukan perulangan di C, yang secara signifikan lebih cepat. Format daftar baris ini sebenarnya lebih disukai jika Anda melakukan banyak perulangan.apply
versi.mapply(data.frame, xy.df, NULL)
Jika Anda ingin sepenuhnya menyalahgunakan data.frame (seperti yang saya lakukan) dan ingin mempertahankan fungsionalitas $, salah satu caranya adalah dengan membagi data.frame Anda menjadi satu baris data.frames yang dikumpulkan dalam daftar:
Ini bukan hanya masturbasi intelektual, tetapi memungkinkan untuk 'mengubah' data.frame menjadi daftar barisnya, menjaga $ indexation yang dapat berguna untuk digunakan lebih lanjut dengan lapply (dengan asumsi fungsi yang Anda berikan untuk lapply menggunakan $ indexation ini)
sumber
data.frame
menjadi satudata.frame
?Solusi yang lebih modern hanya menggunakan
purrr::transpose
:sumber
Saya mengerjakan ini hari ini untuk data.frame (benar-benar data.table) dengan jutaan observasi dan 35 kolom. Tujuan saya adalah mengembalikan daftar data.frames (data.tables) masing-masing dengan satu baris. Artinya, saya ingin membagi setiap baris menjadi data.frame terpisah dan menyimpannya dalam daftar.
Berikut adalah dua metode yang saya temukan yang kira-kira 3 kali lebih cepat daripada
split(dat, seq_len(nrow(dat)))
untuk kumpulan data itu. Di bawah ini, saya membandingkan tiga metode pada 7500 baris, set data 5 kolom ( iris diulang 50 kali).Ini kembali
Meskipun perbedaannya tidak sebesar pada pengujian saya sebelumnya,
setDF
metode lurus secara signifikan lebih cepat di semua tingkat distribusi proses dengan max (setDF) <min (split) danattr
metode ini biasanya lebih dari dua kali lebih cepat.Metode keempat adalah juara ekstrem, yang merupakan metode bersarang sederhana
lapply
, yang menampilkan daftar bersarang. Metode ini mencontohkan biaya pembuatan data.frame dari daftar. Selain itu, semua metode yang saya coba dengandata.frame
fungsi kira-kira urutan besarnya lebih lambat daripadadata.table
teknik.data
sumber
Tampaknya versi
purrr
paket (0.2.2) saat ini adalah solusi tercepat:Mari bandingkan solusi yang paling menarik:
Hasil:
Kita juga bisa mendapatkan hasil yang sama dengan
Rcpp
:Sekarang bandingkan dengan
purrr
:Hasil:
sumber
by_row()
sekarang telah pindah kelibrary(purrrlyr)
Beberapa opsi lagi:
Dengan
asplit
Dengan
split
danrow
data
sumber
Cara terbaik bagi saya adalah:
Contoh data:
Kami menyebutnya
BBmisc
perpustakaanDan hasilnya adalah:
sumber
Cara alternatifnya adalah dengan mengonversi df ke matriks lalu menerapkan fungsi list apply
lappy
di atasnya:ldf <- lapply(as.matrix(myDF), function(x)x)
sumber
Penggunaan alternatif lain
library(purrr)
(yang tampaknya sedikit lebih cepat pada data.frames besar)sumber
Seperti @flodel menulis: Ini mengubah dataframe Anda menjadi daftar yang memiliki jumlah elemen yang sama dengan jumlah baris dalam dataframe:
Anda juga dapat menambahkan fungsi untuk memilih hanya kolom yang bukan NA di setiap elemen daftar:
sumber
The
by_row
fungsi daripurrrlyr
paket akan melakukan ini untuk Anda.Contoh ini menunjukkan
Secara default, nilai yang dikembalikan dari
myfn
dimasukkan ke dalam kolom daftar baru di df yang dipanggil.out
. Di$.out
akhir pernyataan di atas segera memilih kolom ini, mengembalikan daftar daftar.sumber