R data.table fwrite para delimitador de espaço de fread e vazios

Jan 10 2021

Estou tendo problemas ao usar fread com "" como delimitador e valores em branco intercalados. Por exemplo, este:

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

O fread falha com: "Parado no início da linha 4. Esperados 3 campos, mas encontrados 2." O problema parece ser que, com o valor NA na coluna do meio, fwrite fornece valor | espaço | espaço | valor, então fread não reconhece o valor em branco implícito no meio.

Eu entendo que seria simples usar outro delimitador em primeiro lugar. No entanto, é possível fazer com que o fread reproduza o dt original aqui?

EDITAR COM UMA SOLUÇÃO DE LEITURA :

Eu encontrei a mesma pergunta aqui . É um pouco confuso porque dá uma solução, mas depois a solução parou de funcionar. Ao buscar outras pistas, o mais próximo que encontrei agora de uma solução de leitura com fread () é com um comando Unix como este:

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

No Windows 10, tive que fazer algumas tentativas e erros para fazer meu sistema rodar comandos Unix. A parte "wsl" parece depender do sistema. Este vídeo foi útil e usei o primeiro método que ele descreve lá. Esta e esta questão fornecem um pouco mais sobre sed com fread. Este último diz que o sed vem com rTools, embora eu não tenha tentado isso.

Respostas

1 Billy34 Jan 10 2021 at 02:32

Talvez exportar NAcomo algo diferente do ""padrão

Aqui eu 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