在 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)
| Reader | File type | Approx. load time | Memory footprint | Notes |
|---|---|---|---|---|
data.table::fread | CSV | ~3–4s | Low | 对扁平文件最快;类型猜测较好。 |
readr::read_csv | CSV | ~6–8s | Low–medium | 报错信息清晰;区域设置控制出色。 |
arrow::read_parquet | Parquet | ~2–3s | Low | 列式存储;支持惰性过滤和多文件数据集。 |
readxl::read_excel | XLSX | ~8–12s | Medium | 适合业务工作簿;在超宽表上较慢。 |
时间会随硬件变化;仅将此表视为相对速度参考。
可复现导入清单
- 使用
col_types或colClasses固定列类型。 - 显式声明
locale和encoding,避免字符隐性漂移。 - 保持精简模式:在导入时就丢弃不需要的列。
- 每次加载后记录
nrow()和summary(),尽早捕捉异常。
相关指南
- 导入后的整理:: R dplyr Data Wrangling Pipeline
- 快速绘图配方:: R ggplot2 Quickstart
- 手工构建整洁数据框:: How to Create a Dataframe in R