这个包让你可以更快地完成数据集的数据处理工作。放弃选取行或列子集的传统方法,用这个包进行数据处理。用最少的代码,你可以做最多的事。相比使用data.frame,data.table可以帮助你减少运算时间。一个数据表格包含三部分,即DT[i, j, by]。你可以理解为我们告诉R用i来选出行的子集,并计算通过by来分组的j。大多数时候,by是用于类别变量的。
特点
- data.table(DT)的操作语句类似于SQL,DT[i, j, by]中的i, j, by 对应着SQL语句的 i=where, j=select, by=group by。所以DT中的i, j并不是只是像data.frame只代表着行列,它更加的灵活多变
- 符号 ” := “快速的增加或者删除列,类似SQL的update。
- setkey(DT, colA, colB),可以使得检索和分组更加快速
- order,快速多重排序, 例如对DT按照x,y进行排序DT[order(DT$x, -DT$y),]或者DT[with(DT, order(x, -y))
示例
安装及载入程序包
install.packages("data.table")
library(data.table)
- 使用data.table的fread()函数,用下面的方式,快速直接读取航班数据
flights <- fread("https://raw.githubusercontent.com/wiki/arunsrinivasan/flights/NYCflights14/flights14.csv")
- 查看数据
> mydata <- data.table(iris) > mydata Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1: 5.1 3.5 1.4 0.2 setosa 2: 4.9 3.0 1.4 0.2 setosa 3: 4.7 3.2 1.3 0.2 setosa 4: 4.6 3.1 1.5 0.2 setosa 5: 5.0 3.6 1.4 0.2 setosa --- 146: 6.7 3.0 5.2 2.3 virginica 147: 6.3 2.5 5.0 1.9 virginica 148: 6.5 3.0 5.2 2.0 virginica 149: 6.2 3.4 5.4 2.3 virginica 150: 5.9 3.0 5.1 1.8 virginica
- 条件选择
> mydata[Species =="setosa" & Sepal.Length > 5.0 & Sepal.Width == 3.5,c("Sepal.Length","Sepal.Width","Species")] Sepal.Length Sepal.Width Species 1: 5.1 3.5 setosa 2: 5.1 3.5 setosa 3: 5.2 3.5 setosa 4: 5.5 3.5 setosa
- 计算:.() 表示list
> mydata[,sum(Sepal.Length,na.rm = TRUE)] [1] 876.5 > mydata[,.(sum(Sepal.Length,na.rm = TRUE),sd(Sepal.Length),mean(Sepal.Length)),by=Species] Species V1 V2 V3 1: setosa 250.3 0.3524897 5.006 2: versicolor 296.8 0.5161711 5.936 3: virginica 329.4 0.6358796 6.588
上面的函数等价于:
mydata[,list(V1=sum(Sepal.Length,na.rm = TRUE), V2=sd(Sepal.Length), V3=mean(Sepal.Length)), by=.(Species)]
- 函数
mydata[,{ print(Sepal.Length) plot(Sepal.Width) }]
-
setkey
setkey(mydata,Species) mydata["setosa"] mydata[c("setosa","virginica")]
-
排序
> mydata[order(Sepal.Length,-Sepal.Width)] Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1: 4.3 3.0 1.1 0.1 setosa 2: 4.4 3.2 1.3 0.2 setosa 3: 4.4 3.0 1.3 0.2 setosa 4: 4.4 2.9 1.4 0.2 setosa 5: 4.5 2.3 1.3 0.3 setosa --- 146: 7.7 3.8 6.7 2.2 virginica 147: 7.7 3.0 6.1 2.3 virginica 148: 7.7 2.8 6.7 2.0 virginica 149: 7.7 2.6 6.9 2.3 virginica 150: 7.9 3.8 6.4 2.0 virginica
- 特别的符号 .N 是一个内建的变量,它表示当前的分组中,对象的数目
> mydata[Species =="setosa" & Sepal.Length > 5.0 & Sepal.Width == 3.5,.N] [1] 4
-
如何获取每个机场起飞的航班数
> flights[, .(.N), by=.(origin)] origin N 1: JFK 81483 2: LGA 84433 3: EWR 87400
-
当参数j和by里面只有一列,我们可以省略 .(),如:ans <- flights[, .N, by=origin]
- 如何获取美航在所有机场的起/降的数目
> ans <- flights[carrier == "AA", .N, by=.(origin,dest)] > head(ans) origin dest N 1: JFK LAX 3387 2: LGA PBI 245 3: EWR LAX 62 4: JFK MIA 1876 5: JFK SEA 298 6: EWR MIA 848
- 如何获取美航在所有机场的起/降的平均延误时间
> flights[carrier == "AA", + .(mean(arr_delay), mean(dep_delay)), + by=.(origin, dest, month)] origin dest month V1 V2 1: JFK LAX 1 6.590361 14.2289157 2: LGA PBI 1 -7.758621 0.3103448 3: EWR LAX 1 1.366667 7.5000000 4: JFK MIA 1 15.720670 18.7430168 5: JFK SEA 1 14.357143 30.7500000 --- 196: LGA MIA 10 -6.251799 -1.4208633 197: JFK MIA 10 -1.880184 6.6774194 198: EWR PHX 10 -3.032258 -4.2903226 199: JFK MCO 10 -10.048387 -1.6129032 200: JFK DCA 10 16.483871 15.5161290