用经典Mac换行符读取CSV文件的R read.table方法

3

我有一个逗号分隔的值文件,当我在vim中打开它时,它看起来像这样:

12,31,50,,12^M34,23,45,2,12^M12,31,50,,12^M34,23,45,2,12^M

等等,我的意思是我认为我的CSV文件使用了仅CR(经典Mac)行结尾。R的read.table()函数表面上需要LF行结尾或某种变体。

我知道可以预处理文件,这可能是我要做的。除此解决方案外:是否有办法直接导入CR文件到R中?例如,write.table()具有“eol”参数,可以用来指定输出的行尾,但我没有看到read.table()的类似参数(参见:http://stat.ethz.ch/R-manual/R-patched/library/utils/html/read.table.html)。


或者,如果R应该能够优雅地处理Mac行结束符,那么我就知道我还有另一个问题... - SigmaX
2个回答

4
R不会将"^M"识别为任何有用的内容。(我猜可能是vim只是将控制字符M显示为该字符。)如果它出现在文本连接流中,R将认为它不是一个有效的转义字符,因为"^"没有被用于此目的。除非你想通过scan()传递它并使用gsub()进行替换,否则你可能需要进行预处理:
subbed <- gsub("\\^M", "\n", scan(textConnection("12,31,50,,12^M34,23,45,2,12^M12,31,50,,12^M34,23,45,2,12^M"), what="character"))
Read 1 item

> read.table(text=subbed, sep=",")
  V1 V2 V3 V4 V5
1 12 31 50 NA 12
2 34 23 45  2 12
3 12 31 50 NA 12
4 34 23 45  2 12

我想你可能需要将“\\m”作为gsubpatt参数使用。

进一步说明:scan的帮助页面说:“无论以哪种模式打开连接,LF、CRLF或CR都将被接受为行的EOL标记,因此将匹配sep =“\n”。”,因此换行符(如果是这样的话)应该已经被识别出来了,因为read.table是基于scan的。您可以查看?Quotes获取有关转义字符的信息。

如果 vim教程是可信的,那么这些可能是与DOS相关的字符,因为它提供了以下建议:

去掉DOS ctrl-M:

:1,$ s/{ctrl-V}{ctrl-M}//

是的,^M只是vim中CR的占位符。而且,仔细查看我的错误后,发现即使转换为LF后,我的问题仍然存在:我只需要在一开始设置fill=T :# - SigmaX
啊,老问题了,变长行的问题。count.fields 函数可以很好地解决这个问题。 - IRTFM

0

有一种R本地解决方案,无需预处理或外部技巧。您应该使用encoding输入参数来调用read.table函数,并将其设置为"latin1"以进行Mac字符编码。

例如,假设您的文件以Mac (^M为返回)格式保存为test.csv,则可以按以下方式加载:

 test <- read.table("./test.csv", sep=",", encoding="latin1")

查看可以传递给编码参数的选项,将 ?Encoding 类型输入到 R 解释器中,您将看到支持的编码为 "latin1""UTF-8""bytes""unknown"

这是最好且最清爽的方法。


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