R数据表中使用fwrite转换为fread时使用空格分隔符和空值的处理

3

我在使用fread函数时遇到了问题,主要是针对空格作为分隔符且会有连续的空值情况。例如:

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出现错误:"第4行提前停止。期望3个字段,但只找到了2个。" 问题似乎在于中间列中有NA值,fwrite将给出value|space|space|value的结果,然后fread无法识别中间的隐含空白值。
我知道一开始使用另一个分隔符可能更简单。但是,有没有可能让fread还原原始数据表? 带读取侧解决方案的编辑: 我在这里找到了相同的问题here。虽然它提供了一个解决方案,但后来却出现了问题。在追寻其他线索时,我现在发现使用类似Unix命令的fread()的最接近的读取侧解决方案是:
dt <- fread(cmd="wsl sed -r 's/ /,/g' dt.csv") #converts spaces to commas on the way in

在Windows 10系统上,我不得不进行一些尝试和错误才能运行Unix命令。 "wsl" 部分似乎取决于系统。 这个视频很有帮助,我使用了他在那里描述的第一种方法。 这个问题和这个问题提供了更多关于使用fread和sed的信息。 后者说sed随rTools而来,但我没有尝试过。

展示样本文本文件的原始内容(在代码块中)可能更有效,而不是试图以编程方式创建它。虽然我赞赏这种努力,但最终,在这里写作并不重要,过度努力这样做可能会分散注意力。(这还可以让您更恰当地模仿您尝试导入的实际文本文件。) - r2evans
@r2evans 谢谢,我会考虑一下。在这个简单的情况下,我认为有趣的是fwrite输出的内容,fread会误解。 - Mark E.
1个回答

1
也许默认情况下将 NA 导出为其他内容而不是 ""
这里我使用 @
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

谢谢,这对于写入方面来说是另一个可选项,很有意义。我仍然很好奇,在读取方面是否可以将连续的分隔符视为暗示之间存在空值。 - Mark E.
如果您将" "作为nana.string参数,它将干扰strip.white参数并且无法捕获它。 - Billy34

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接