Sesuatu seperti yang berikut ini harus menghasilkan setiap frame data sebagai elemen terpisah dalam satu daftar:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
Ini mengasumsikan bahwa Anda memiliki CSV tersebut di satu direktori - direktori kerja Anda saat ini - dan semuanya memiliki ekstensi huruf kecil .csv
.
Jika Anda ingin menggabungkan frame data tersebut menjadi satu frame data, lihat solusi di jawaban lain menggunakan hal-hal seperti do.call(rbind,...)
, dplyr::bind_rows()
atau data.table::rbindlist()
.
Jika Anda benar-benar ingin setiap frame data dalam objek yang terpisah, meskipun itu sering tidak disarankan, Anda bisa melakukan hal berikut dengan assign
:
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))
Atau, tanpa assign
, dan untuk menunjukkan (1) bagaimana nama file dapat dibersihkan dan (2) menunjukkan cara menggunakan list2env
, Anda dapat mencoba yang berikut:
temp = list.files(pattern="*.csv")
list2env(
lapply(setNames(temp, make.names(gsub("*.csv$", "", temp))),
read.csv), envir = .GlobalEnv)
Tetapi sekali lagi, sering kali lebih baik meninggalkan mereka dalam satu daftar.
A5C1D2H2I1M1N2O1R2T1
sumber
assign
... Jika Anda ingin nilai yang ditetapkan berada di lingkungan global, pastikan Anda mengaturinherits=T
.Solusi cepat dan ringkas
tidyverse
: (lebih dari dua kali lebih cepat dari Base Rread.csv
)dan data.table 's
fread()
bahkan dapat memotong-saat beban setengah lagi. (untuk 1/4 kali Base R )The
stringsAsFactors = FALSE
argumen menjaga bebas faktor dataframe, (dan sebagai marbel poin, adalah pengaturan default untukfread
)Jika typecasting sedang kurang ajar, Anda bisa memaksa semua kolom sebagai karakter dengan
col_types
argumen.Jika Anda ingin masuk ke dalam subdirektori untuk membuat daftar file yang pada akhirnya akan diikat, maka pastikan untuk memasukkan nama path, serta daftarkan file dengan nama lengkapnya di daftar Anda. Ini akan memungkinkan pekerjaan mengikat untuk pergi di luar direktori saat ini. (Memikirkan nama path lengkap sebagai operasi seperti paspor untuk memungkinkan pergerakan kembali melintasi 'batas' direktori.)
Seperti yang dijelaskan Hadley di sini (sekitar setengah jalan):
Fitur Bonus - menambahkan nama file ke catatan per permintaan fitur Niks dalam komentar di bawah ini:
* Tambahkan asli
filename
ke setiap catatan.Kode menjelaskan: membuat fungsi untuk menambahkan nama file ke setiap catatan selama pembacaan awal tabel. Kemudian gunakan fungsi itu alih-alih
read_csv()
fungsi sederhana .(Pendekatan typecasting dan penanganan subdirektori juga dapat ditangani di dalam
read_plus()
fungsi dengan cara yang sama seperti yang diilustrasikan dalam varian kedua dan ketiga yang disarankan di atas.)Kasus Penggunaan Middling
Kasing Penggunaan Lebih Besar
Berbagai Kasus Penggunaan
Baris: jumlah file (1000, 100, 10)
Kolom: ukuran kerangka data akhir (5MB, 50MB, 500MB)
(klik pada gambar untuk melihat ukuran asli)
Hasil R dasar lebih baik untuk kasus penggunaan terkecil di mana overhead membawa perpustakaan C purrr dan dplyr untuk menanggung lebih besar daripada keuntungan kinerja yang diamati ketika melakukan tugas pemrosesan skala yang lebih besar.
jika Anda ingin menjalankan tes Anda sendiri, Anda mungkin menemukan skrip bash ini bermanfaat.
bash what_you_name_this_script.sh "fileName_you_want_copied" 100
akan membuat 100 salinan file Anda diberi nomor urut (setelah 8 karakter awal nama file dan garis bawah).Atribusi dan Penghargaan
Dengan terima kasih khusus kepada:
map_df()
sini .fread()
. (Saya perlu belajardata.table
.)sumber
readAddFilename <- function(flnm) { read_csv(flnm) %>% mutate(filename = flnm) }
Lalu hanya drop itu kemap_df
bukan hanya membaca sederhanaread_csv()
yang ada sekarang. Saya dapat memperbarui entri di atas untuk menunjukkan fungsi dan bagaimana hal itu masuk ke dalam pipa jika Anda masih memiliki pertanyaan atau Anda pikir itu akan membantu.read_csv
itu jauh lebih lambat daripadafread
. Saya akan memasukkan tolok ukur jika Anda ingin mengatakan sesuatu lebih cepat. Satu ide adalah membuat 30 file 1GB dan membacanya, itu akan menjadi kasus di mana kinerja penting.fread()
dan dplyr ' sread_csv()
: 14,2 vs 19,9 detik. TBH, saya hanya membandingkan basis R dengan dplyr dan karenaread_csv()
sekitar 2-4x lebih cepat dari ituread.csv()
, pembandingan sepertinya tidak perlu. Namun menarik untukfread()
berputar dan berhenti sejenak untuk melihat hasil benchmark yang lebih lengkap. Terima kasih lagi!Berikut adalah beberapa opsi untuk mengonversi file .csv menjadi satu data.frame menggunakan R base dan beberapa paket yang tersedia untuk membaca file di R.
Ini lebih lambat dari opsi di bawah ini.
Sunting: - Beberapa pilihan tambahan menggunakan
data.table
danreadr
Sebuah
fread()
versi, yang merupakan fungsi daridata.table
paket. Ini adalah jauh pilihan tercepat di R .Menggunakan readr , yang merupakan paket lain untuk membaca file csv. Ini lebih lambat daripada
fread
, lebih cepat dari basis R tetapi memiliki fungsi yang berbeda.sumber
data.table
versi, yang seharusnya meningkatkan kinerja.do.call
Selain menggunakan
lapply
atau beberapa konstruksi perulangan lainnya di R, Anda dapat menggabungkan file CSV menjadi satu file.Di Unix, jika file tidak memiliki header, maka semudah:
atau jika ada tajuk, dan Anda dapat menemukan string yang cocok dengan tajuk dan hanya tajuk (mis. misalkan garis tajuk semuanya dimulai dengan "Umur"), Anda akan melakukannya:
Saya pikir di Windows Anda bisa melakukan ini dengan
COPY
danSEARCH
(atauFIND
sesuatu) dari kotak perintah DOS, tetapi mengapa tidak menginstalcygwin
dan mendapatkan kekuatan shell perintah Unix?sumber
Git
menginstal?Ini adalah kode yang saya kembangkan untuk membaca semua file csv menjadi R. Ini akan membuat dataframe untuk setiap file csv secara individual dan judul yang dataframe nama asli file tersebut (menghapus spasi dan .csv) Saya harap Anda merasa bermanfaat!
sumber
Tiga jawaban teratas oleh @ A5C1D2H2I1M1N2O1R2T1, @leerssej, dan @marbel dan semuanya pada dasarnya sama: terapkan ketakutan pada setiap file, kemudian rbind / rbindlist data.tables yang dihasilkan. Saya biasanya menggunakan
rbindlist(lapply(list.files("*.csv"),fread))
formulir.Ini lebih baik daripada alternatif R-internal lainnya, dan bagus untuk sejumlah kecil csv besar, tetapi bukan yang terbaik untuk sejumlah besar csv kecil ketika masalah kecepatan. Dalam hal ini, bisa jauh lebih cepat untuk digunakan pertama kali
cat
, seperti yang disarankan oleh @Spacedman dalam jawaban peringkat ke-4. Saya akan menambahkan beberapa detail tentang bagaimana melakukan ini dari dalam R:Namun, bagaimana jika setiap csv memiliki header?
Dan bagaimana jika Anda memiliki banyak file sehingga
*.csv
glob shell gagal?Dan bagaimana jika semua file memiliki header DAN ada terlalu banyak file?
Dan bagaimana jika csv gabungan yang dihasilkan terlalu besar untuk memori sistem?
Dengan header?
Akhirnya, bagaimana jika Anda tidak ingin semua .csv dalam direktori, melainkan kumpulan file tertentu? (Juga, mereka semua memiliki header.) (Ini adalah use case saya.)
dan ini adalah tentang kecepatan yang sama seperti xargs ketakutan kucing :)
Catatan: untuk data.tabel pra-v1.11.6 (19 Sep 2018), hapus
cmd=
darifread(cmd=
.Tambahan: menggunakan perpustakaan paralel di tempat serial lapply, misalnya,
rbindlist(lapply(list.files("*.csv"),fread))
juga jauh lebih cepat daripada ketakutan rbindlist lapply.Saatnya membaca 121401 csvs menjadi satu data.table. Setiap csv memiliki 3 kolom, satu baris tajuk, dan, rata-rata, 4,510 baris. Mesin adalah VM GCP dengan 96 core:
Singkatnya, jika Anda tertarik pada kecepatan, dan memiliki banyak file dan banyak inti, xargs kucing ketakutan adalah sekitar 50x lebih cepat daripada solusi tercepat di 3 jawaban teratas.
sumber
Dalam pandangan saya, sebagian besar jawaban lain sudah usang
rio::import_list
, yang merupakan kalimat singkat:Setiap argumen tambahan diteruskan ke
rio::import
.rio
dapat menangani hampir semua format file R dapat membaca, dan menggunakandata.table
'sfread
mana mungkin, jadi harus cepat juga.sumber
Menggunakan
plyr::ldply
ada sekitar peningkatan kecepatan 50% dengan mengaktifkan.parallel
opsi sambil membaca 400 file csv masing-masing sekitar 30-40 MB. Contoh termasuk bilah kemajuan teks.sumber
fread
atauuser-defined functions
? Terima kasih!?ldply
pertunjukan...
argumen lain diteruskan ke.fun
. Menggunakan salah satufread, skip = 100
ataufunction(x) fread(x, skip = 100)
akan bekerjafunction(x) fread(x, skip = 100)
tidak bekerja untuk saya tetapi memberikan args tambahan setelah nama fungsi telanjang melakukan trik. Terima kasih lagi!Membangun pada komentar dnlbrk, menetapkan dapat jauh lebih cepat daripada list2env untuk file besar.
Dengan mengatur argumen full.names menjadi true, Anda akan mendapatkan path lengkap ke setiap file sebagai string karakter terpisah dalam daftar file Anda, misalnya, List_of_file_paths [1] akan menjadi sesuatu seperti "C: / Users / Anon / Documents / Folder_with_csv_files / file1.csv "
Anda bisa menggunakan data.table ketakutan atau basis R read.csv bukannya read_csv. Langkah file_name memungkinkan Anda untuk merapikan nama sehingga setiap frame data tidak tetap dengan path lengkap ke file seperti namanya. Anda bisa memperluas loop untuk melakukan hal-hal lebih lanjut ke tabel data sebelum mentransfernya ke lingkungan global, misalnya:
sumber
Ini adalah contoh spesifik saya untuk membaca banyak file dan menggabungkannya menjadi 1 bingkai data:
sumber
rbindlist()
daridata.table
Kode-kode berikut ini akan memberi Anda kecepatan tercepat untuk data besar selama Anda memiliki banyak core di komputer Anda:
Diperbarui pada 2020/04/16: Ketika saya menemukan paket baru yang tersedia untuk komputasi paralel, solusi alternatif disediakan menggunakan kode berikut.
sumber
Saya suka menggunakan pendekatan
list.files()
,lapply()
danlist2env()
(ataufs::dir_ls()
,purrr::map()
danlist2env()
). Tampaknya sederhana dan fleksibel.Atau, Anda dapat mencoba paket kecil { tor } ( to-R ): Secara default ia mengimpor file dari direktori kerja ke dalam daftar (
list_*()
varian) atau ke lingkungan global (load_*()
varian).Sebagai contoh, di sini saya membaca semua file .csv dari direktori kerja saya ke dalam daftar menggunakan
tor::list_csv()
:Dan sekarang saya memuat file-file itu ke lingkungan global saya dengan
tor::load_csv()
:Jika Anda perlu membaca file tertentu, Anda dapat mencocokkan path file dengan
regexp
,ignore.case
daninvert
.Untuk penggunaan yang lebih fleksibel
list_any()
. Ini memungkinkan Anda untuk memasok fungsi pembaca melalui argumen.f
.Berikan argumen tambahan melalui ... atau di dalam fungsi lambda.
sumber
Diminta agar saya menambahkan fungsionalitas ini ke paket R stackoverflow. Mengingat bahwa ini adalah paket kecil (dan tidak dapat bergantung pada paket pihak ketiga), inilah yang saya buat:
Dengan parameterisasi fungsi pembaca dan peredam, orang dapat menggunakan data.tabel atau dplyr jika mereka memilihnya, atau hanya menggunakan fungsi R dasar yang baik untuk kumpulan data yang lebih kecil.
sumber