Skip to content

R - 二进制文件

R 语言:保存和加载 R 对象(二进制文件)

Section titled “R 语言:保存和加载 R 对象(二进制文件)”

在数据分析中,你经常需要保存你的工作——数据框、模型或其他 R 对象——以便你可以关闭 R 会话,稍后恢复而无需重新运行整个脚本。虽然你可以使用 CSV 等文本文件,但将 R 特有对象保存为二进制文件通常效率更高,也更可靠。

二进制文件以压缩的、机器可读的格式存储对象。这有两个主要优势:

  1. 速度:读写速度比解析文本文件快得多。
  2. 完整性:精确的 R 对象得以保留,包括数据类型、因子水平和模型属性,这些在转换为纯文本格式时可能会丢失。

将单个 R 对象保存到二进制文件的标准和最常见方法是使用 saveRDS() 和 readRDS() 函数。这是保存中间结果、处理过的数据或训练好的模型的推荐方法。

# 将单个 R 对象保存到文件
saveRDS(object, file = "path/to/your/file.rds")
# 从 RDS 文件读取 R 对象
my_object <- readRDS(file = "path/to/your/file.rds")

以下是参数的描述:

  • object:你想要保存的 R 对象(例如,数据框、列表、模型)。
  • file:表示路径和文件名的字符串。.rds 扩展名是一种强烈建议的约定。

让我们创建一个示例数据框,将其保存到 .rds 文件,从环境中移除,然后重新加载。

# 1. 创建一个示例数据框
sample_data <- data.frame(
id = 1:5,
name = c("Alice", "Bob", "Charlie", "David", "Eve"),
score = c(8.5, 9.1, 7.3, 8.8, 9.9),
is_active = c(TRUE, FALSE, TRUE, TRUE, FALSE)
)
cat("--- 原始数据框 ---\n")
print(sample_data)
# 2. 将数据框保存到 RDS 文件
saveRDS(sample_data, file = "sample_data.rds")
cat("\n对象 'sample_data' 已保存到 'sample_data.rds'\n")
# 3. 从当前的 R 会话中移除该对象
rm(sample_data)
# 验证它是否已移除(这将导致错误)
# print(sample_data)
cat("\n对象 'sample_data' 已从环境中移除。\n")
# 4. 从 RDS 文件重新加载对象
loaded_data <- readRDS(file = "sample_data.rds")
cat("\n--- 已加载数据框 ---\n")
print(loaded_data)

当你执行上述代码时,你将看到原始数据框、确认消息,然后是完美恢复的数据框打印在最后。

--- Original Data Frame ---
id name score is_active
1 1 Alice 8.5 TRUE
2 2 Bob 9.1 FALSE
3 3 Charlie 7.3 TRUE
4 4 David 8.8 TRUE
5 5 Eve 9.9 FALSE
Object 'sample_data' saved to 'sample_data.rds'
Object 'sample_data' has been removed from the environment.
--- Loaded Data Frame ---
id name score is_active
1 1 Alice 8.5 TRUE
2 2 Bob 9.1 FALSE
3 3 Charlie 7.3 TRUE
4 4 David 8.8 TRUE
5 5 Eve 9.9 FALSE

虽然 .rds 文件非常适合 R 到 R 的工作流,但它们无法被 Python 等其他编程语言读取。为了在不同平台之间共享数据,建议使用现代、高性能的二进制格式:

  • Apache Feather(.feather 或 .arrow):专为 R 和 Python 之间数据框的极速读写而设计。R 中的 arrow 包提供了接口。
  • Apache Parquet(.parquet):一种列式存储格式,为大数据优化。它高度压缩,并且只读取所需列时效率极高。也可通过 arrow 包访问。

注意: 原始教程提到了 readBin() 和 writeBin()。这些是用于从连接中读写原始字节的底层函数。它们不适合用于保存和加载整个数据框或其他复杂的 R 对象。它们的使用极少,通常保留用于特定应用,例如与自定义二进制文件格式或网络协议交互。对于一般数据分析,你应始终优先选择 saveRDS() 和 readRDS()。