在 R 中使用 data.table 进行数据处理
Matt Dowle and Arun Srinivasan
Instructors, DataCamp
第一个参数 i 用于"取子集"或"筛选"行
# data.table 语法通式
DT[i, j, by]
| | |
| | --> 按什么分组?
| -----> 做什么?
--------> 作用于哪些行?
# 取 batrips 的第 3 和第 4 行
batrips[3:4]
# 等同于
batrips[3:4, ]
# 取除前 5 行外的其余行
batrips[-(1:5)]
# 等同于
batrips[!(1:5)]
.N 是一个整数,表示 data.table 的行数i 中可替代 nrow(x) nrow(batrips)
326339
batrips[326339]
trip_id duration
588914 364
# 返回最后一行
batrips[.N]
trip_id duration
588914 364
# 返回除最后 10 行外的所有行
ans <- batrips[1:(.N-10)]
nrow(ans)
326329
# 取 subscription_type 为 "Subscriber" 的行
batrips[subscription_type == "Subscriber"]
# 如果 batrips 只是 data frame
batrips[batrips$subscription_type == "Subscriber", ]
# 子集:start_terminal = 58 且 end_terminal 不为 65 的行
batrips[start_terminal == 58 & end_terminal != 65]
# 如果 batrips 只是 data frame
batrips[batrips$start_terminal == 58 & batrips$end_terminal != 65]
自动使用二级索引进行加速
set.seed(1)
dt <- data.table(x = sample(10000, 10e6, TRUE),
y = sample(letters, 1e6, TRUE))
indices(dt)
NULL
# 首次运行 0.207s
#(建索引 + 子集 的时间)
system.time(dt[x == 900])
user system elapsed
0.207 0.015 0.226
indices(dt)
"x"
# 后续运行 0.002s
#(使用索引即时取子集)
system.time(dt[x == 900])
user system elapsed
0.002 0.000 0.002
在 R 中使用 data.table 进行数据处理