R 的 data.table 資料操作
Matt Dowle and Arun Srinivasan
Instructors, DataCamp
第一個引數 i 用來「取子集」或「篩選」列。
# data.table 語法的一般形式
DT[i, j, by]
| | |
| | --> 依什麼分組?
| -----> 要做什麼?
--------> 哪些列?
# 取出第 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.207 秒
#(建立索引 + 篩選時間)
system.time(dt[x == 900])
user system elapsed
0.207 0.015 0.226
indices(dt)
"x"
# 之後執行約 0.002 秒
#(用索引即時篩選)
system.time(dt[x == 900])
user system elapsed
0.002 0.000 0.002
R 的 data.table 資料操作