在 data.table 中筛选行

在 R 中使用 data.table 进行数据处理

Matt Dowle and Arun Srinivasan

Instructors, DataCamp

data.table 语法通式

第一个参数 i 用于"取子集"或"筛选"行

# data.table 语法通式
DT[i, j, by]
   |  |  |
   |  |  --> 按什么分组?
   |  -----> 做什么?
   --------> 作用于哪些行?
在 R 中使用 data.table 进行数据处理

行号

# 取 batrips 的第 3 和第 4 行
batrips[3:4]

# 等同于
batrips[3:4, ]
# 取除前 5 行外的其余行
batrips[-(1:5)] 

# 等同于
batrips[!(1:5)]
在 R 中使用 data.table 进行数据处理

特殊符号 .N

  • .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
在 R 中使用 data.table 进行数据处理

逻辑表达式(I)

# 取 subscription_type 为 "Subscriber" 的行
batrips[subscription_type == "Subscriber"]

# 如果 batrips 只是 data frame
batrips[batrips$subscription_type == "Subscriber", ]
在 R 中使用 data.table 进行数据处理

逻辑表达式(II)

# 子集: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]
在 R 中使用 data.table 进行数据处理

逻辑表达式(III)

自动使用二级索引进行加速

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 进行数据处理

Passons à la pratique !

在 R 中使用 data.table 进行数据处理

Preparing Video For Download...