R data.table fwrite ke fread space delimiter dan kosongkan

Jan 10 2021

Saya mengalami masalah saat menggunakan fread dengan "" sebagai pembatas dan nilai kosong yang diselingi. Misalnya, ini:

dt <- data.table(1:5,1:5,1:5) #make a simple table
dt[3,"V2" := NA] #add a blank in the middle to illustrate the problem
fwrite(dt, file = "dt.csv", sep = " ") #save to file
dt <- fread("dt.csv", sep = " ") #try to retrieve

Fread gagal dengan: "Dihentikan lebih awal pada baris 4. Diharapkan 3 bidang tetapi ditemukan 2." Masalahnya tampaknya dengan nilai NA di kolom tengah, fwrite memberikan nilai | spasi | spasi | nilai, maka fread tidak mengenali nilai kosong tersirat di tengah.

Saya mengerti bahwa akan mudah untuk menggunakan pembatas lain sejak awal. Namun, apakah mungkin mendapatkan ketakutan untuk mereproduksi dt aslinya di sini?

EDIT DENGAN SOLUSI SISI BACA :

Saya menemukan pertanyaan yang sama di sini . Agak membingungkan karena memberikan solusi, tetapi kemudian solusi tersebut berhenti bekerja. Saat mengejar beberapa petunjuk lain, hal terdekat yang sekarang saya temukan dengan solusi sisi baca dengan fread () adalah dengan perintah Unix seperti ini:

dt <- fread(cmd="wsl sed -r 's/ /,/g' dt.csv") #converts spaces to commas on the way in

Pada Windows 10 saya harus melakukan beberapa trial and error agar sistem saya menjalankan perintah Unix. Bagian "wsl" tampaknya bergantung pada sistem. Video ini sangat membantu, dan saya menggunakan metode pertama yang dia jelaskan di sana. Ini dan pertanyaan ini memberikan sedikit lebih banyak tentang rasa takut. Yang terakhir mengatakan sed datang dengan rTools, meskipun saya tidak mencobanya.

Jawaban

1 Billy34 Jan 10 2021 at 02:32

Mungkin mengekspor NAsebagai sesuatu selain ""secara default

Di sini saya gunakan @

library(data.table)
dt <- data.table(1:5,1:5,1:5) #make a simple table
dt[3,"V2" := NA] #add a blank in the middle to illustrate the problem
fwrite(dt, file = "dt.csv", sep = " ", na="@") #save to file
dt <- fread("dt.csv", sep = " ",na.strings = "@") #try to retrieve