R語言data.table 包

R語言 數據結構 C語言 科技 數學之美 2017-04-11

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

取子集操作

  1. data.table包用來取子集的函數與R中常用數據類型有些不同。

  2. 它採用:逗號+expression 的表達方式。

  3. 一個 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

相關推薦

推薦中...