Skip to content

在 R 中导入数据:快速、正确且可复现的加载

问题

文件读取缓慢和乱码问题会在分析开始前就把流程拖垮。团队不得不为每一个新的 CSV 或 Excel 文件重复编写导入代码,浪费大量时间。

激化

错误的编码会把非 ASCII 文本打乱,ID 字段的前导零会被悄悄丢掉,大体量 CSV 还会拖垮内存。每一次重复运行都会削弱大家对数据集的信任,拖延建模和报表产出。

解决方案

使用专门的 R 数据读取工具,并显式控制区域设置、分隔符和列类型。下面的模式可以让导入过程既快速,又在不同机器上保持类型稳定和结果可复现。

CSV 和 TSV:在 readr 默认基础上显式指定 locale

library(readr)
 
orders <- read_csv(
  "data/orders.csv",
  locale = locale(encoding = "UTF-8", decimal_mark = ".", grouping_mark = ","),
  col_types = cols(
    order_id = col_character(),
    order_date = col_date(format = "%Y-%m-%d"),
    revenue = col_double(),
    region = col_character()
  )
)
  • 使用 col_types 防止 R 误判为 factor 或截断 ID。
  • 制表符分隔文件用 read_tsv();分号分隔用 read_delim(delim = ";")

Excel:使用 readxl 读取 xls/xlsx

library(readxl)
 
budget <- read_excel(
  "data/budget.xlsx",
  sheet = "FY24",
  range = "A1:G200",
  col_types = c("text", "numeric", "numeric", "date", "text", "numeric", "numeric")
)
  • readxl 不依赖 Java,并能稳定保留单元格格式。
  • skip = 跳过表头行,并只选择必要的范围以提升速度。

大型 CSV:data.table::fread

library(data.table)
 
clicks <- fread(
  "data/clicks.csv",
  encoding = "UTF-8",
  colClasses = list(character = "user_id"),
  nThread = 4
)
  • 自动检测分隔符;如有需要可用 sep = "\t" 覆盖。
  • 使用 select = 只加载所需列,节省内存。

列式与多语言数据:arrow

library(arrow)
 
events <- read_parquet("data/events.parquet", as_data_frame = TRUE)
 
# Or stream a large dataset by batches
ds <- open_dataset("s3://bucket/events/")  # works locally on folders, too
events_summary <- ds %>%
  filter(country %in% c("DE", "FR")) %>%
  group_by(country) %>%
  summarise(count = n())
  • Arrow 默认保留列类型并以 UTF-8 处理文本。
  • 适合与 Python/SQL 引擎互操作以及进行超内存数据的筛选计算。

处理编码和分隔符

  • 对多语言数据始终显式指定 encoding,尽量全流程使用 UTF-8。
  • 对欧洲风格 CSV,设置 locale(decimal_mark = ",", grouping_mark = ".")
  • 当分隔符不确定时,先用小样本测试:read_delim(..., n_max = 20) 确认解析是否正确。

小型基准测试(100 万行、8 列、SSD)

ReaderFile typeApprox. load timeMemory footprintNotes
data.table::freadCSV~3–4sLow对扁平文件最快;类型猜测较好。
readr::read_csvCSV~6–8sLow–medium报错信息清晰;区域设置控制出色。
arrow::read_parquetParquet~2–3sLow列式存储;支持惰性过滤和多文件数据集。
readxl::read_excelXLSX~8–12sMedium适合业务工作簿;在超宽表上较慢。

时间会随硬件变化;仅将此表视为相对速度参考。

可复现导入清单

  • 使用 col_typescolClasses 固定列类型。
  • 显式声明 localeencoding,避免字符隐性漂移。
  • 保持精简模式:在导入时就丢弃不需要的列。
  • 每次加载后记录 nrow()summary(),尽早捕捉异常。

相关指南