Next: , Previous: Imports, Up: Introduction



1.2 导出到文本文件中

从 R 里面导出结果通常是一个很少争论的事情,但是实际操作中仍然 有一些问题。在知道目标应用软件前提下,通常把文本文件作为最为便利的 中间转换工具。(如果需要二进制文件,见二进制文件(Binary files) 一章)。

函数 cat 是导出数据的函数的基础。它有一个file参数 和append。通过连续地调用 cat 对一个文本文件写入。 最好的方式是,特别需要多次这样做的时候,首先为写入或添加文本 打开一个 file 连接,然后用cat连接,最后关掉 (close)它。

最常见的工作是把一个矩阵或数据框以数字的矩形网格方式写入文件中, 而且还可能保留行列的标签。 这可以通过函数write.tablewrite 来完成。 函数write仅可以写出一个矩阵或向量的特定列(和对一个矩阵进行转置)。 函数 write.table 更为便利,它可把一个数据框( 或一个可以强制转换为数据框的对象)以包含行列标签的方式写出。

在把一个数据框写入到一个文本文件中时,有许多问题需要考虑。

  1. 精度问题

    大多数通过这些函数对实/复数的转换是全精度的,但是用write时, 精度由options(digits)的当前设置确定。 如果需要更多的控制,在一个数据框上逐列使用 format

  2. 首行问题

    R 倾向在首行不出现表示行名字的条目,因此 在文件里面

                              dist    climb   time
              Greenmantle     2.5     650     16.083
                 ...
         

    其它一些系统需要给行名字一个条目(可能为空),此时, 可以通过在write.table 中 设置参数col.names = NA 来实现。

  3. 分隔符问题 文件中常用的字段分隔符是逗号,因为在英语语系的国家, 逗号几乎不可能出现在任何字段中。这种文件被称为 CSV(逗号分隔值)文件,对应的包装函数(wrapper function) write.csv提供了适当的默认值。 在一些本地系统中,逗号作为十进制位中的小数点 (在write.csv函数中设置参数dec = ","1 ,此时CSV文件以分号作为字段分隔符: write.csv2 设置了适当的默认值。

    用分号或制表符(sep = "\t")可能是一种 比较安全的选择。

  4. 缺损值问题 默认情况下,缺损值以 NA 形式输出,但这可以通过参数 na来改变。 注意,NaNwrite.table里面 以 NA 看待,但在catwrite里面是区别对待的。
  5. 被引号括起的字符串 默认情况下,字符串被引号括起(包括行列的名字)。 参数 quote 控制着字符和因子变量的引号引用问题。

    需要注意字符串中的引号嵌套问题。三种 有用的形式如下

              > df <- data.frame(a = I("a \" quote"))
              > write.table(df)
              "a"
              "1" "a \" quote"
              > write.table(df, qmethod = "double")
              "a"
              "1" "a "" quote"
              > write.table(df, quote = FALSE, sep = ",")
              a
              1,a " quote
         

    逃逸(Escape)的第二种形式常用于电子表格中。

MASS 中的函数 write.matrix 为写矩阵 提供了一种专用的接口。它同时提供了以区块方式写的可选项,这样 可以降低内存的使用。

sink 可能把标准 R 输出重定向到一个文件中,因此 捕获了 print 语句(可能是暗含的)的输出。通常, 这不是最有效的办法,options(width)设置可能需要增加。

foreign里面的函数 write.foreignwrite.table 产生文本文件,同时编写一个 可以让另外一个统计包读入该文本文件的代码文件。现在支持 导出到 SPSSStata


Footnotes

[1] 译者注:比如德国,1/2=0,5。注意, 他们不用句点表示小数点,他们采用的是逗号。