R data.table fwrite al delimitador de espacio de carga y se vacía

Jan 10 2021

Tengo problemas al usar fread con "" como delimitador y valores en blanco intercalados. Por ejemplo, esto:

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

El mensaje falla con: "Detenido antes en la línea 4. Se esperaba 3 campos pero se encontró 2." El problema parece ser que con el valor NA en la columna central, fwrite da valor | espacio | espacio | valor, luego fread no reconoce el valor en blanco implícito en el medio.

Entiendo que sería sencillo utilizar otro delimitador en primer lugar. Sin embargo, ¿es posible obtener fread para reproducir el dt original aquí?

EDITAR CON UNA SOLUCIÓN LATERAL :

Encontré la misma pregunta aquí . Es un poco confuso porque da una solución, pero luego la solución dejó de funcionar. Al buscar otras pistas, lo más cercano que he encontrado a una solución de lectura con fread () es con un comando de Unix como este:

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

En Windows 10 tuve que hacer algunas pruebas y errores para que mi sistema ejecutara comandos Unix. La parte "wsl" parece depender del sistema. Este video fue útil y utilicé el primer método que describe allí. Esta y esta pregunta proporcionan un poco más de sed con fread. Este último dice que sed viene con rTools, aunque no lo intenté.

Respuestas

1 Billy34 Jan 10 2021 at 02:32

Tal vez exportar NAcomo algo que no sea el ""predeterminado

Aquí yo 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