R data.table fwrite to fread delimitatore di spazio e svuota

Jan 10 2021

Ho problemi a usare fread con "" come delimitatore e valori vuoti intervallati. Ad esempio, questo:

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

Il fread fallisce con: "Fermato in anticipo sulla riga 4. Previsti 3 campi ma trovati 2." Il problema sembra essere che con il valore NA nella colonna centrale, fwrite fornisce valore | spazio | spazio | valore, quindi fread non riconosce il valore vuoto implicito nel mezzo.

Capisco che sarebbe semplice utilizzare un altro delimitatore in primo luogo. Tuttavia, è possibile ottenere fread per riprodurre l'originale dt qui?

MODIFICA CON UNA SOLUZIONE LATO LETTURA :

Ho trovato la stessa domanda qui . È un po 'confuso perché fornisce una soluzione, ma in seguito la soluzione ha smesso di funzionare. Perseguendo altri percorsi, il più vicino che ho trovato ora a una soluzione sul lato di lettura con fread () è con un comando Unix come questo:

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

Su Windows 10 ho dovuto fare alcuni tentativi ed errori per far sì che il mio sistema eseguisse i comandi Unix. La parte "wsl" sembra dipendere dal sistema. Questo video è stato utile e ho usato il primo metodo che descrive lì. Questa e questa domanda forniscono un po 'di più su sed con fread. Quest'ultimo dice che sed viene fornito con rTools, anche se non l'ho provato.

Risposte

1 Billy34 Jan 10 2021 at 02:32

Forse esportare NAcome qualcosa di diverso ""da quello predefinito

Qui io uso @

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