Bagaimana cara membuat daftar frame data dan bagaimana cara mengakses masing-masing frame data dari daftar?
Misalnya, bagaimana saya bisa memasukkan bingkai data ini dalam daftar?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
=
tidak<-
di dalamdata.frame()
. Dengan menggunakan<-
Anda membuaty1
dany2
di lingkungan global Anda dan bingkai data Anda tidak seperti yang Anda inginkan.<-
di dalam data.frame (). Sungguh baru saya.Jawaban:
Ini tidak terkait dengan pertanyaan Anda, tetapi Anda ingin menggunakan
=
dan tidak<-
dalam pemanggilan fungsi. Jika Anda menggunakan<-
, Anda pada akhirnya akan membuat variabely1
dany2
di lingkungan apa pun yang Anda gunakan :Ini tidak akan memiliki efek yang tampaknya diinginkan untuk membuat nama kolom dalam bingkai data:
The
=
operator, di sisi lain, akan mengasosiasikan vektor Anda dengan argumen untukdata.frame
.Adapun pertanyaan Anda, membuat daftar bingkai data mudah:
Anda mengakses frame data sama seperti Anda akan mengakses elemen daftar lainnya:
sumber
Jawaban yang lain menunjukkan bagaimana untuk membuat daftar data.frames ketika Anda sudah memiliki sekelompok data.frames, misalnya,
d1
,d2
, .... Memiliki berurutan bernama frame data masalah, dan menempatkan mereka dalam daftar adalah perbaikan yang baik, tetapi praktik terbaik adalah menghindari memiliki banyak data.frame tidak ada dalam daftar di tempat pertama.Jawaban lain memberikan banyak detail tentang cara menetapkan bingkai data untuk mendaftar elemen, mengaksesnya, dll. Kami akan membahasnya sedikit di sini juga, tetapi Poin Utama adalah jangan menunggu sampai Anda memiliki banyak
data.frames
untuk menambahkannya ke daftar. Mulailah dengan daftar.Sisa dari jawaban ini akan mencakup beberapa kasus umum di mana Anda mungkin tergoda untuk membuat variabel berurutan, dan menunjukkan cara langsung ke daftar. Jika Anda baru mendaftar di R, Anda mungkin ingin juga membaca Apa perbedaan antara
[[
dan[
dalam mengakses elemen daftar? .Daftar dari awal
Jangan pernah membuat
d1
d2
d3
, ...,dn
sejak awal. Buat daftard
dengann
elemen.Membaca banyak file ke dalam daftar bingkai data
Ini dilakukan dengan cukup mudah saat membaca dalam file. Mungkin Anda punya file
data1.csv, data2.csv, ...
di direktori. Sasaran Anda adalah daftar kerangka datamydata
. Disebut Hal pertama yang Anda butuhkan adalah vektor dengan semua nama file. Anda dapat membangun ini dengan pasta (misalnya,my_files = paste0("data", 1:5, ".csv")
), tapi mungkin lebih mudah untuk menggunakanlist.files
untuk meraih semua file yang sesuai:my_files <- list.files(pattern = "\\.csv$")
. Anda dapat menggunakan ekspresi reguler untuk mencocokkan file, membaca lebih lanjut tentang ekspresi reguler dalam pertanyaan lain jika Anda memerlukan bantuan di sana. Dengan cara ini Anda dapat mengambil semua file CSV bahkan jika mereka tidak mengikuti skema penamaan yang bagus. Atau Anda dapat menggunakan pola regex yang lebih menarik jika Anda perlu mengambil file CSV tertentu dari banyak file.Pada titik ini, sebagian besar pemula R akan menggunakan
for
loop, dan tidak ada yang salah dengan itu, itu berfungsi dengan baik.Cara yang lebih mirip R untuk melakukannya adalah dengan
lapply
, yang merupakan jalan pintas untuk hal di atasTentu saja, gantikan fungsi impor data lainnya
read.csv
dengan cara yang sesuai.readr::read_csv
ataudata.table::fread
akan lebih cepat, atau Anda mungkin juga memerlukan fungsi berbeda untuk jenis file yang berbeda.Apa pun itu, akan mudah untuk memberi nama elemen daftar agar sesuai dengan file
Memisahkan bingkai data menjadi daftar bingkai data
Ini super mudah, fungsi dasar
split()
melakukannya untuk Anda. Anda dapat membagi dengan kolom (atau kolom) dari data, atau dengan apa pun yang Anda inginkanIni juga merupakan cara yang bagus untuk memecah bingkai data menjadi potongan-potongan untuk validasi silang. Mungkin Anda ingin membagi
mtcars
menjadi potongan pelatihan, tes, dan validasi.Mensimulasikan daftar bingkai data
Mungkin Anda mensimulasikan data, sesuatu seperti ini:
Tetapi siapa yang hanya melakukan satu simulasi? Anda ingin melakukan ini 100 kali, 1000 kali, lebih banyak! Tetapi Anda tidak ingin 10.000 frame data di ruang kerja Anda. Gunakan
replicate
dan letakkan dalam daftar:Dalam hal ini khususnya, Anda juga harus mempertimbangkan apakah Anda benar-benar membutuhkan frame data yang terpisah, atau apakah frame data tunggal dengan kolom "grup" juga berfungsi? Menggunakan
data.table
ataudplyr
cukup mudah untuk melakukan hal-hal "dengan grup" ke bingkai data.Saya tidak memasukkan data saya dalam daftar :( Saya akan lain kali, tetapi apa yang bisa saya lakukan sekarang?
Jika mereka bermacam-macam aneh (yang tidak biasa), Anda dapat menetapkannya:
Jika Anda memiliki data frame yang bernama dalam pola, misalnya,
df1
,df2
,df3
, dan Anda ingin mereka dalam daftar, Anda bisaget
mereka jika Anda dapat menulis ekspresi reguler untuk mencocokkan nama-nama. Sesuatu sepertiSecara umum,
mget
digunakan untuk mendapatkan banyak objek dan mengembalikannya dalam daftar bernama. Rekanannyaget
digunakan untuk mendapatkan satu objek dan mengembalikannya (tidak ada dalam daftar).Menggabungkan daftar frame data ke dalam frame data tunggal
Tugas umum adalah menggabungkan daftar bingkai data menjadi satu bingkai data besar. Jika Anda ingin menumpuknya di atas satu sama lain, Anda akan menggunakannya
rbind
untuk sepasang mereka, tetapi untuk daftar bingkai data di sini adalah tiga pilihan yang baik:(Demikian pula menggunakan
cbind
ataudplyr::bind_cols
untuk kolom.)Untuk menggabungkan (bergabung) daftar bingkai data, Anda dapat melihat jawaban ini . Seringkali, idenya adalah untuk digunakan
Reduce
denganmerge
(atau fungsi penggabungan lainnya) untuk menyatukan mereka.Mengapa memasukkan data dalam daftar?
Masukan data yang sama dalam daftar karena Anda ingin melakukan hal-hal yang mirip dengan setiap frame data, dan fungsi seperti
lapply
,sapply
do.call
, yangpurrr
paket , dan lamaplyr
l*ply
fungsi membuatnya mudah untuk melakukan itu. Contoh orang yang dengan mudah melakukan sesuatu dengan daftar semuanya ada di SO.Bahkan jika Anda menggunakan perulangan rendah untuk, lebih mudah untuk mengulangi elemen daftar daripada membangun nama variabel dengan
paste
dan mengakses objek denganget
. Lebih mudah di-debug juga.Pikirkan skalabilitas . Jika Anda benar-benar hanya perlu tiga variabel, baik itu untuk digunakan
d1
,d2
,d3
. Tetapi jika ternyata Anda benar-benar membutuhkan 6, itu lebih banyak mengetik. Dan waktu berikutnya, ketika Anda membutuhkan 10 atau 20, Anda menemukan diri Anda menyalin dan menyisipkan baris kode, mungkin menggunakan find / mengganti perubahand14
untukd15
, dan Anda berpikir ini bukan bagaimana pemrograman harus . Jika Anda menggunakan daftar, perbedaan antara 3 kasus, 30 kasus, dan 300 kasus paling banyak adalah satu baris kode --- tidak ada perubahan sama sekali jika jumlah kasus Anda terdeteksi secara otomatis oleh, misalnya, berapa banyak.csv
file di direktori.Anda dapat memberi nama elemen daftar, jika Anda ingin menggunakan sesuatu selain indeks numerik untuk mengakses frame data Anda (dan Anda dapat menggunakan keduanya, ini bukan pilihan XOR).
Secara keseluruhan, menggunakan daftar akan membuat Anda menulis kode yang lebih bersih, lebih mudah dibaca, yang akan menghasilkan lebih sedikit bug dan lebih sedikit kebingungan.
sumber
r
danlist
.my_data <- NULL
alih `my_data <- list () '! :)my_data <- list()
jelaskan bahwa Anda membuat daftar, yang bagus! Hapus kode adalah hal yang baik. Saya tidak melihat adanya keuntungan menggunakanmy_data <- NULL
sebagai gantinya.names(my_data) <- gsub("\\.csv$", "", my_files)
;) <br> Tapi saya menghargai saran Anda karena saya belajar banyak dari mereka sebagai pemula dan saya sangat menghargainya :)Anda juga dapat mengakses kolom dan nilai tertentu di setiap elemen daftar dengan
[
dan[[
. Berikut ini beberapa contohnya. Pertama, kita hanya dapat mengakses kolom pertama dari setiap frame data dalam daftar denganlapply(ldf, "[", 1)
, di mana1
menandakan nomor kolom.Demikian pula, kita dapat mengakses nilai pertama di kolom kedua dengan
Kemudian kita juga dapat mengakses nilai kolom secara langsung, sebagai vektor, dengan
[[
sumber
Jika Anda memiliki sejumlah besar frame data yang diberi nama secara berurutan, Anda dapat membuat daftar subset dari frame data yang diinginkan seperti ini:
di mana
my.list2
mengembalikan daftar yang berisi frame data 2, 3 dan 4.Perhatikan, bagaimanapun, bahwa frame data dalam daftar di atas tidak lagi bernama. Jika Anda ingin membuat daftar yang berisi bagian dari bingkai data dan ingin mempertahankan namanya, Anda dapat mencoba ini:
yang mengembalikan:
sumber
lapply(foo, get)
, gunakan sajamget(foo)
Jika Anda memiliki jumlah data.frame "besar" dengan nama yang mirip (di sini d # di mana # adalah bilangan bulat positif), berikut ini adalah sedikit peningkatan metode @ mark-miller. Ini lebih singkat dan mengembalikan nama daftar data.frame, di mana setiap nama dalam daftar adalah nama data.frame asli yang sesuai.
Kuncinya adalah menggunakan
mget
bersama denganls
. Jika bingkai data d1 dan d2 yang disediakan dalam pertanyaan adalah satu-satunya objek dengan nama d # di lingkungan, makayang akan kembali
Metode ini mengambil keuntungan dari argumen pola di
ls
, yang memungkinkan kita untuk menggunakan ekspresi reguler untuk melakukan penguraian yang lebih baik dari nama-nama objek di lingkungan. Alternatif untuk regex"^d[0-9]+$"
adalah"^d\\d+$"
.Sebagai @gregor menunjukkan , itu adalah lebih baik secara keseluruhan untuk mengatur proses konstruksi data Anda sehingga data.frames dimasukkan ke dalam daftar nama di awal.
data
sumber
Ini mungkin sedikit terlambat tetapi kembali ke contoh Anda, saya pikir saya akan memperluas jawabannya hanya sedikit.
Maka Anda membuat daftar dengan mudah:
Sekarang Anda memiliki daftar tetapi bukannya mengakses daftar dengan cara lama seperti
Anda dapat menggunakan fungsi ini untuk mendapatkan & menetapkan kerangka data pilihan Anda.
Sekarang dapatkan yang Anda inginkan.
Semoga sedikit tambahan bisa membantu.
Bersulang!
sumber
GETDF_FROMLIST(mylist, 1)
untukmylist[[1]]
? Jika Anda lebih memilih sintaks fungsi, Anda bahkan dapat melakukannya"[["(mylist, 1)
tanpa mendefinisikan fungsi kustom.return(DF_LIST[[ITEM_LOC]])
, tidak perlu menetapkan variabel perantara.Sangat sederhana ! Ini saran saya:
Jika Anda ingin memilih kerangka data di ruang kerja Anda, coba ini:
atau
semua ini akan memberikan hasil yang sama.
Anda dapat mengubah
is.data.frame
untuk memeriksa tipe variabel lain sepertiis.function
sumber
Saya menganggap diri saya seorang pemula, tetapi saya pikir saya memiliki jawaban yang sangat sederhana untuk salah satu subquestions asli yang belum dinyatakan di sini: mengakses frame data, atau bagian dari itu.
Mari kita mulai dengan membuat daftar dengan bingkai data seperti yang dinyatakan di atas:
Kemudian, jika Anda ingin mengakses nilai tertentu di salah satu frame data, Anda bisa melakukannya dengan menggunakan tanda kurung ganda secara berurutan. Set pertama membawa Anda ke dalam bingkai data, dan set kedua membawa Anda ke koordinat tertentu:
sumber