data.table包使用手册
对数据分析来说使用data.table目前对R
语言处理大数据是最优解,因此熟悉掌握使用data.table
包是有必要,之前只是零散的使用,没有成体系的学习总结这一工具,因此这次特意在博客上面总结归纳一下。
简单的示例
library(data.table)
DT = data.table(
ID = c("b","b","b","a","a","c"),
a = 1:6,
b = 7:12,
c = 13:18
)
DT
## ID a b c
## 1: b 1 7 13
## 2: b 2 8 14
## 3: b 3 9 15
## 4: a 4 10 16
## 5: a 5 11 17
## 6: c 6 12 18
class(DT$ID)
## [1] "character"
data.table简单示例,在data.table包中更像是使用sql
语法来进行数据处理。
DT[i, j, by]
## R: i j by
## SQL: where | order by select | update group by
使用data.table
的诀窍就是,子集排序是对i,计算是使用j,由by分组
# 数据准备工作,从nycflight13包中读取到flghts数据,使用data.table函数转化为data.table包
library(nycflights13)
data<-nycflights13::flights
data<-as.data.frame(data)
mydata <- data.table(data)
查询功能
使用条件查询条件
对始发地为JFK并且月份是6L的航班进行查询。
ans<-mydata[origin == "JFK"&month == 6L]
head(ans)
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## 1: 2013 6 1 2 2359 3 341 350
## 2: 2013 6 1 538 545 -7 925 922
## 3: 2013 6 1 539 540 -1 832 840
## 4: 2013 6 1 553 600 -7 700 711
## 5: 2013 6 1 554 600 -6 851 908
## 6: 2013 6 1 557 600 -3 934 942
## arr_delay carrier flight tailnum origin dest air_time distance hour minute
## 1: -9 B6 739 N618JB JFK PSE 200 1617 23 59
## 2: 3 B6 725 N806JB JFK BQN 203 1576 5 45
## 3: -8 AA 701 N5EAAA JFK MIA 140 1089 5 40
## 4: -11 EV 5716 N835AS JFK IAD 42 228 6 0
## 5: -17 UA 1159 N33132 JFK LAX 330 2475 6 0
## 6: -8 B6 715 N766JB JFK SJU 198 1598 6 0
## time_hour
## 1: 2013-06-01 23:00:00
## 2: 2013-06-01 05:00:00
## 3: 2013-06-01 05:00:00
## 4: 2013-06-01 06:00:00
## 5: 2013-06-01 06:00:00
## 6: 2013-06-01 06:00:00
得到前两行
(ans<-mydata[1:2])
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## 1: 2013 1 1 517 515 2 830 819
## 2: 2013 1 1 533 529 4 850 830
## arr_delay carrier flight tailnum origin dest air_time distance hour minute
## 1: 11 UA 1545 N14228 EWR IAH 227 1400 5 15
## 2: 20 UA 1714 N24211 LGA IAH 227 1416 5 29
## time_hour
## 1: 2013-01-01 05:00:00
## 2: 2013-01-01 05:00:00
对列表进行按某一列或者某几列进行排序
首先对origin进行升序排序,然后对dest进行降序排序
ans<-mydata[order(origin,-dest)]
head(ans)
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## 1: 2013 1 2 905 822 43 1313 1045
## 2: 2013 1 3 848 850 -2 1149 1113
## 3: 2013 1 4 901 850 11 1120 1113
## 4: 2013 1 6 843 848 -5 1053 1111
## 5: 2013 1 7 858 850 8 1105 1113
## 6: 2013 1 8 847 850 -3 1116 1113
## arr_delay carrier flight tailnum origin dest air_time distance hour minute
## 1: NA EV 4140 N15912 EWR XNA NA 1131 8 22
## 2: 36 EV 4125 N21129 EWR XNA 196 1131 8 50
## 3: 7 EV 4125 N16178 EWR XNA 168 1131 8 50
## 4: -18 EV 4625 N12172 EWR XNA 174 1131 8 48
## 5: -8 EV 4125 N13118 EWR XNA 163 1131 8 50
## 6: 3 EV 4125 N14180 EWR XNA 177 1131 8 50
## time_hour
## 1: 2013-01-02 08:00:00
## 2: 2013-01-03 08:00:00
## 3: 2013-01-04 08:00:00
## 4: 2013-01-06 08:00:00
## 5: 2013-01-07 08:00:00
## 6: 2013-01-08 08:00:00
对列进行筛选
提取出arr_delay
列,返回的为向量,vector。
ans<-mydata[,arr_delay]
head(ans)
## [1] 11 20 33 -18 -25 12
提取出arr_delay
列,返回为data.table
类型。
ans<-mydata[,list(arr_delay)]
head(ans)
## arr_delay
## 1: 11
## 2: 20
## 3: 33
## 4: -18
## 5: -25
## 6: 12
同时筛选出arr_delay
和dep_delay
列
ans<-mydata[,.(arr_delay,dep_delay)]
head(ans)
## arr_delay dep_delay
## 1: 11 2
## 2: 20 4
## 3: 33 2
## 4: -18 -1
## 5: -25 -6
## 6: 12 -4
使用.()
的效果和list()
效果相同。
对j使用计算
计算出有多少航班的延误时间为0
ans <- mydata[, sum( (arr_delay + dep_delay) < 0 )]
ans
## [1] NA
提取出子集i并且在j进行计算
ans <- mydata[origin == "JFK"&month == 6L,
.(m_arr = mean(arr_delay),m_dep = mean(dep_delay))]
ans
## m_arr m_dep
## 1: NA NA
这里不知道为什么返回了NA值,之后再试试。