data.table包是幹什麼的
R語言裡有data.frame的數據結構。data.table是data.frame的一個擴展,它幾乎繼承了所有的data.frame特性,我們通常對data.frame作出的操作,對於data.table同樣也是有效的。那麼data.table存在的價值是什麼呢?它是由C語言寫的,所以運行速度快,數據存儲效率高,像取子集,變量分組,更新變量等操作都要優於data.frame,而且對於大型數據集的支持比較好。所以,如果你還沒有學習過data.frame,可以直接越過它直接學習data.table。
實例中學習
創建數據集
創建data.frame
df <- data.frame(x=rnorm(9),y=rep(c('a','b','c'),each=3),z=rnorm(9))
## x y z
創建data.table
library(data.table)dt <- data.table(x=rnorm(9),y=rep(c('a','b','c'),each=3),z=rnorm(9))
## x y z
查看內存下所有的data table的情況
tables()
## NAME NROW NCOL MB COLS KEY
像data.frame一樣進行操作
dt[2,] #取第二行,所有列
## x y z
dt[dt$y=="a",] #取dt表中y列取值為"a"的所有行
## x y z
和data.frame的區別
dt[c(2,3)] #data.table中索引沒有逗號,默認是按行取,這裡取出的是第2,3行
## x y z
df[c(2,3)] #data.frame沒有逗號默認是按列取得,這裡取出了第2,3列
## y z
取子集操作
data.table包用來取子集的函數與R中常用數據類型有些不同。
它採用:逗號+expression 的表達方式。
一個 expression 是指包含在一對花括號裡的一系列語句。
例1
設想你想要求出x這一列的均值,z這一列的總和:
dt[,list(mean(x),sum(z))]
## V1 V2
例2
設想你想要對y變量各種值出現的頻次做個統計
dt[,table(y)]
## y
例3
設想你想生成新的一列,新列是z那一列的平方
dt[,w:=z^2]
這裡用 data.table,而不是用 data.frame 的好處就體現出來了,data.table 是直接在原來的表裡添加新的一列,而 data.frame 要重新生成一個表,再把新列加進去,所以當數據集很大時,非常佔內存,速度也會下降。
例4
dt2 <- dtdt[,y:=2]
## x y z w
head(dt2,3)
## x y z w
這裡,我們把dt賦值給了dt2,然後修改了dt的值,發現dt2的值也被修改了。也就是說dt和dt2在內存中佔用的是同一個地方,並沒有做到真正的複製。這裡我們需要用 copy 函數來進行真正的複製。
dt3 <- copy(dt)dt[,y:=3]
## x y z w
head(dt3,n=3)
## x y z w
例5
多條expression的情形
這裡我們創建一個叫做 m 的新列,這個表達式包含兩個語句,放在一個花括號裡,語句之間用分號隔開,最後的返回值就是新列的值。
dt[,m:={tmp=x+z;log(abs(tmp)+2)}]
## x y z w m
在對數據進行分組時,常常依據一些判斷條件,例如下面對 a 的正負性進行分組。
dt[,a:=x>0]
## x y z w m a
分組之後就可以求出不同組的一些特徵,例如
dt[,b:=mean(x+w),by=a]
## x y z w m a b
dt[,.N,by=a]
## a N