data.table包使用总结
R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加。data.table已经在金融,基因工程学等领域大放光彩。他尤其适合那些需要处理大型数据集(比如 1GB 到100GB)需要在内存中处理数据的人。不过这个包的一些符号并不是很容易掌握,因为这些操作方式在R中比较少见。这也是这篇文章的目的,为了给大家提供一个速查的手册。
data.table的通用格式: DT[i, j, by],对于数据集DT,选取子集行i,通过by分组计算j
1.首先下载安装data.table包
install.packages("data.table")
library(data.table)
利用fread函数导入数据,在data.table包支持使用fread函数从本地或者web上导入数据,功能相当于base包的read.csv。
mydata = fread("https://github.com/arunsrinivasan/satrdays-workshop/raw/master/flights_2014.csv")
2.数据简单描述
nrow(mydata)
[1] 253316
ncol(mydata)
[1] 17
names(mydata)
[1] "year" "month" "day" "dep_time" "dep_delay" "arr_time" "arr_delay"
[8] "cancelled" "carrier" "tailnum" "flight" "origin" "dest" "air_time"
[15] "distance" "hour" "min"
head(mydata[,c(2:6)])
month day dep_time dep_delay arr_time
1: 1 1 914 14 1238
2: 1 1 1157 -3 1523
3: 1 1 1902 2 2224
4: 1 1 722 -8 1014
5: 1 1 1347 2 1706
6: 1 1 1824 4 2145
3.选择或保留某几列
.()为list()的一个别名。如果使用.(),返回的为一个data.table对象。如果不使用.(),结果为返回一个向量。
如果要选择carrier列,那么可以选择如下几种方式实现:
dat1 = mydata[ , carrier] # 返回一组向量
dat1 = mydata[ , .(carrier)] #返回一个data.table
dat1 = mydata[, c("carrier"), with=FALSE] #返回一组数据框
根据列的位置保留某几列,比如选择第二列:
dat2 =mydata[, 2, with=FALSE]
保留多列:
dat3 = mydata[, .(origin, year, month, hour)]
根据列的位置保留多列:
dat3 = mydata[, .(origin, year, month, hour)]
删去列:利用!符号删除某列
dat5 = mydata[, !c("origin"), with=FALSE]
删去多列
dat6 = mydata[, !c("origin", "year", "month"), with=FALSE]
利用%like% 命令进行模糊匹配:
dat7 = mydata[,names(mydata) %like% "dep", with=FALSE]
4.对变量进行重命名
可以利用setnames()函数对变量进行重命名操作:
setnames(mydata, c("dest"), c("Destination"))
对多个变量进行重命名:
setnames(mydata, c("dest","origin"), c("Destination", "origin.of.flight"))
5.子集的筛选与过滤
假设要找到origin为‘JFK’的所有子集:
dat8 = mydata[origin == "JFK"]
按多个条件选择
dat9 = mydata[origin %in% c("JFK", "LGA")]
dat11 = mydata[origin == "JFK" & carrier == "AA"]
6.利用索引提升数据操作效率
使用setkey()函数设置键值
setkey()函数可以在数据集mydata上设置键值。当我们设置好key后,data.table会将数据按照key来排序。
利用setkey函数将origin设置为mydata的索引:
setkey(mydata, origin)
当设置好索引后,可直接利用索引的值进行过滤查找
data12 = mydata[c("JFK", "LGA")]
来看看用了索引与没用索引的搜索效率:
system.time(mydata[origin %in% c("JFK", "LGA")])
system.time(mydata[c("JFK", "LGA")])
对多个变量设置索引
setkey(mydata, origin, dest)
mydata[.("JFK", "MIA")]
这等同于:
mydata[origin == "JFK" & dest == "MIA"]