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)。

4

2 回答 2

4

R 不会将 "^M" 识别为任何有用的东西。(我想 vim 可能只是向您显示一个 cntrl-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"patt作为gsub.

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

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

剥离 DOS ctrl-M 的:

:1,$ s/{ctrl-V}{ctrl-M}//
于 2012-02-06T20:03:11.620 回答
0

有一个 R 原生解决方案,不需要预处理或外部 hack。您应该使用函数的encoding输入参数read.table并将其设置为等于"latin1"Mac 字符编码。

例如,假设你的 Mac 文件(^M 表示返回)格式保存为test.csv,加载如下:

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

要查看可以将encoding参数类型传递给 R 解释器的选项,?Encoding您将看到"latin1"、或是受支持的编码。"UTF-8""bytes""unknown"

这是做到这一点的最好和最干净的方法。

于 2014-01-13T22:25:12.733 回答