R data.table 包入门指南:高效数据处理基础
概述
本文将介绍 R 语言中 data.table
包的基础用法,这是一个专为高效数据处理而设计的增强版 data.frame
。data.table
通过简洁的语法和内部优化机制,能够显著提升数据操作的速度和内存效率。
数据准备
我们使用纽约市2014年航班数据作为示例数据集,包含1月至10月的航班信息。使用 fread()
函数可以快速加载数据:
flights <- fread("flights14.csv")
基础操作
1. 创建 data.table
创建 data.table
的方式与创建 data.frame
类似:
DT = data.table(
ID = c("b","b","b","a","a","c"),
a = 1:6,
b = 7:12,
c = 13:18
)
2. 通用语法结构
data.table
的核心语法遵循 DT[i, j, by]
的形式:
i
: 行筛选条件j
: 列操作表达式by
: 分组变量
这种结构类似于 SQL 中的 WHERE
、SELECT
和 GROUP BY
组合。
3. 行筛选 (i)
条件筛选
# 筛选6月份从JFK起飞的航班
flights[origin == "JFK" & month == 6L]
按行号筛选
# 获取前两行
flights[1:2]
排序
# 先按origin升序,再按dest降序排列
flights[order(origin, -dest)]
4. 列操作 (j)
选择单列(返回向量)
flights[, arr_delay]
选择单列(返回data.table)
flights[, .(arr_delay)] # 或 flights[, list(arr_delay)]
选择多列并重命名
flights[, .(delay_arr = arr_delay, delay_dep = dep_delay)]
列计算
# 计算总延误时间小于0的航班数量
flights[, sum((arr_delay + dep_delay) < 0)]
5. 组合操作
筛选后计算
# 计算6月份JFK航班的平均到达和起飞延误
flights[origin == "JFK" & month == 6L,
.(m_arr = mean(arr_delay), m_dep = mean(dep_delay))]
计数操作
# 计算6月份JFK的航班数量
flights[origin == "JFK" & month == 6L, .N] # .N是特殊计数变量
6. 列名引用方式
直接引用列名
flights[, c("arr_delay", "dep_delay")]
使用变量选择列
select_cols = c("arr_delay", "dep_delay")
flights[, ..select_cols] # 使用..前缀
# 或
flights[, select_cols, with = FALSE]
排除列
flights[, !c("arr_delay", "dep_delay")]
高级特性
1. 处理不存在的元素
data.table
提供了多种方式处理查询中不存在的元素:
# 键查找(返回包含NA的行)
setkeyv(flights, "origin")
flights["XYZ"]
# 逻辑查找(返回空data.table)
flights[origin == "XYZ"]
# 精确匹配(不返回NA行)
flights["XYZ", nomatch=NULL]
2. 列范围选择
从 v1.9.5+ 开始,可以通过列名范围选择:
flights[, year:day] # 选择year到day之间的所有列
flights[, !(year:day)] # 排除这些列
性能优势
data.table
的设计哲学使其具有显著性能优势:
- 内部优化:操作被整体优化而非单独执行
- 惰性求值:只计算真正需要的部分
- 内存效率:避免不必要的数据复制
这些特性使得 data.table
在处理大型数据集时表现尤为出色。
总结
本文介绍了 data.table
包的基础操作,包括数据筛选、列操作和简单聚合。掌握这些基础后,用户可以进一步学习分组聚合、数据合并等高级功能。data.table
的简洁语法和高效实现使其成为 R 语言中处理数据的强大工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考