5.4 用 R 把数据写入文件

5.4.1 问题

你想把数据写入一个文件。

5.4.2 方案

5.4.2.1 写到有分隔符的文本文件

最简单的方式是用 write.csv() 。默认情况下,write.csv() 包含行名,但是这通常没必要,而且可能会导致混乱。

  1. # 一个简单的例子
  2. data <- read.table(header = TRUE, text = "
  3. subject sex size
  4. 1 M 7
  5. 2 F NA
  6. 3 F 9
  7. 4 M 11
  8. ")
  9. # 写入到文件,不显示行名
  10. write.csv(data, "data.csv", row.names = FALSE)
  11. # 替代 “NA”,输出空格
  12. write.csv(data, "data.csv", row.names = FALSE, na = "")
  13. # 用制表符可以不显示行和列名
  14. write.table(data, "data.csv", sep = "\t", row.names = FALSE,
  15. col.names = FALSE)

5.4.2.2 以 R 的数据格式保存

write.csv()write.table() 是最适合与其他数据分析程序交互操作的函数。然而,他们不会保持数据结构中的特殊属性,如:该列是否为一个字符类型或因子,或因子的水平的顺序。为了实现这一点,我们应该将该数据写成适合 R 的特殊格式。

下面是三种主要的方法:

第一个方法是输出 R 源代码,代码运行时,该对象将被重新创建。这种方法应该适用于大部分数据对象,但它可能无法专一地重构一些较为复杂的数据对象。

  1. # 保存在一个能容易被 R 载入的文本文件中
  2. dump("data", "data.Rdmpd")
  3. # 可以同时保存多个对象
  4. dump(c("data", "data1"), "data.Rdmpd")
  5. # 再次加载数据
  6. source("data.Rdmpd")
  7. # 载入时,原始的数据名称将被自动使用

另一个方法是,在 RDS 格式中写入单个数据对象。这种格式可以是二进制或 ASCII。二进制更紧凑,而 ASCII 在配合版本控制系统(如 Git)方面则更有效率。

  1. # 在二进制 RDS 格式中保存一个简单的对象
  2. saveRDS(data, "data.rds")
  3. # 或者使用 ASCII 格式
  4. saveRDS(data, "data.rds", ascii=TRUE)
  5. # 再次载入:
  6. data <- readRDS("data.rds")

也可以将多个对象以 RData 格式保存到一个单一的文件。

  1. # 在二进制 RData 格式中保存多个对象
  2. save(data, file="data.RData")
  3. # 或者使用 ASCII 格式
  4. save(data, file="data.RData", ascii=TRUE)
  5. # 可以保存多个对象
  6. save(data, data1, file="data.RData")
  7. # 再次载入:
  8. load("data.RData")

saveRDS()save() 的一个重要区别:对于前者,当你用 readRDS() 读取数据时,是你指定对象的名称;而对于后者,当你用 load() 载入数据,R 会自动使用该数据原来的对象名称。自动使用原始对象名称有时可以简化工作流程,但这种在不同的环境中都使用相同数据对象名称的设定也会成为一个缺点。