data.table筆記1

dplyr包历帚,該包類似于SQL的一套語法規(guī)則的確幫助我們快速的進(jìn)行數(shù)據(jù)篩選、排序等功能屯换,那dplyr包已經(jīng)如此便捷的情況下,為什么還要學(xué)習(xí)data.table包呢?

一方面彤悔,data.table所使用的代碼量更少嘉抓,效率更高,特別是在處理大至GB級(jí)別的數(shù)據(jù)時(shí)晕窑,它比dplyr以及python的pandas處理數(shù)據(jù)都要快抑片;
另一方面,快速地?cái)?shù)據(jù)讀取杨赤,快速地聚合排序敞斋,快速地分組運(yùn)算,以及靈活自然的語法疾牲,使得data.table可以稱之為加強(qiáng)版data.frame植捎,因而適用于data.frame的函數(shù)也適用于data.table。

首先我們來看data.table和data.frame的區(qū)別:

1.與data.frame不同阳柔,在生成data.table的時(shí)候character類型的數(shù)據(jù)不會(huì)默認(rèn)地轉(zhuǎn)換成factors類型焰枢,這樣的好處就是你不用再在語句中每次都添加'stringsAsFactors = FALSE'了。

2.打印數(shù)據(jù)時(shí)在行號(hào)后面加了一個(gè)冒號(hào):用以區(qū)分行號(hào)與第一列數(shù)據(jù)舌剂。

3.當(dāng)數(shù)據(jù)行數(shù)超過options()參數(shù)設(shè)置datatable.print.nrows的值時(shí)(默認(rèn)值為100)济锄,僅僅只會(huì)打印該數(shù)據(jù)集的前5行以及最后5行的數(shù)據(jù)。

4.data.table沒有行名稱霍转。


data.table語法的一般形式
調(diào)用公式:

# 對(duì)于數(shù)據(jù)集DT荐绝,選取子集行i,通過by分組計(jì)算j
> DT[i,j,by]

數(shù)據(jù)處理
1.數(shù)據(jù)篩選
(1)行篩選 :直接采用邏輯語句

library(data.table)
mtcars_dt <- data.table(mtcars)
str(mtcars_dt)
head(mtcars_dt)
head(mtcars_dt[cyl == 8],)

(2)列篩選:直接輸入列名,注意.()格式

head(mtcars_dt[, .(mpg,cyl,hp)],3)

2.選取子集
選取子集仍然采用subset函數(shù)避消,調(diào)用公式為:

# subset是行滿足條件
# select是列滿足條件
> subset(x, subset, select)
head(subset(mtcars_dt,cyl == 8,select = c("mpg")))

3.數(shù)據(jù)排序 setorder()

head(setorder(mtcars_dt,mpg,-disp))   ## mpg升序 disp降序

4.增刪變量
(1)增加變量的調(diào)用公式

# 單變量添加
DT[i,LHS := RHS,by = ...]
# LHS為新建的變量低滩,RHS為該變量的計(jì)算方式

# 雙變量添加
> DT[i, c("LHS1","LHS2") := list(RHS1, RHS2), by=...]

# #多變量添加,注意`:=`
> DT[i, `:=`(LHS1=RHS1,LHS2=RHS2,...), by=...]
head(mtcars_dt[,`:=`(mpg_reci=1/mpg,new = cyl +gear)])

(2)刪除變量(變量:=NULL即可)

head(mtcars_dt[,mpg_reci := NULL])

5.分組匯總
分組匯總只需在by指定分組變量沾谓,在j指定計(jì)算函數(shù)即可

# 單一分組匯總
head(mtcars_dt[,.(mean_mpg = mean(mpg),num = length(mpg),sum_disp = sum(disp)),by = cyl])
#多分組匯總 list函數(shù)的運(yùn)用

```{r}
 head(mtcars_dt[,.(mean_mpg = mean(mpg),num=length(mpg),sum_disp = sum(disp)),by=list(cyl,gear)])

dplyr也可以多個(gè)by.

data.table有個(gè)特殊的變量.N 可以直接計(jì)算分組

head(mtcars_dt[,.N,by = .(cyl,vs)])
# 還可以用
# head(mtcars_dt[,.N,by = list(cyl,vs)])

6.數(shù)據(jù)合并

## 數(shù)據(jù)合并仍然采用merge函數(shù)委造,只是合并對(duì)象必須是data.table類型,這樣才能發(fā)揮出data.table的威力!

merge(x, y, by = NULL, by.x = NULL, by.y = NULL,all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x", ".y"),
allow.cartesian=getOption("datatable.allow.cartesian"), ...)

merge和rbind,cbind不一樣
參考dplyr包的 full_join 等

7.其他操作

(1)快速查找某一區(qū)間%between%

head(mtcars_dt[disp %between% c(150,200)])

區(qū)間這個(gè)地方比 filter函數(shù)方便

(2)判斷兩個(gè)數(shù)據(jù)框是否相同 all.equal

# 返回邏輯向量均驶,有主鍵時(shí)昏兆,對(duì)主鍵列做是否重復(fù)判斷;無主鍵時(shí)妇穴,對(duì)所有列做判斷爬虱。
# 利用此函數(shù),我們就可以輕松地對(duì)數(shù)據(jù)去重腾它。
dt1 <- data.table(A = letters[1:10], X = 1:10, key = "A")
dt2 <- data.table(A = letters[5:14], Y = 1:10, key = "A")

identical(all.equal(dt1,dt1),TRUE)

其他函數(shù)

讀取文件函數(shù):fread()
參照幫助文檔?fread

合并 rbindlist()
Makes one data.table from a list of many
Same as do.call("rbind",1) on data.frameS,but much faster.
用法:

rbindlist(1,use.names = fill,fill = FALSE,idcol = NULL)
# rbind(..., use.names=TRUE, fill=FALSE, idcol=NULL)

例子Examples

# default case
DT1 = data.table(A=1:3,B=letters[1:3])
DT2 = data.table(A=4:5,B=letters[4:5])
l = list(DT1,DT2)
rbindlist(l)

# bind correctly by names
DT1 = data.table(A=1:3,B=letters[1:3])
DT2 = data.table(B=letters[4:5],A=4:5)
l = list(DT1,DT2)
rbindlist(l, use.names=TRUE)

# fill missing columns, and match by col names
DT1 = data.table(A=1:3,B=letters[1:3])
DT2 = data.table(B=letters[4:5],C=factor(1:2))
l = list(DT1,DT2)
rbindlist(l, use.names=TRUE, fill=TRUE)

# generate index column, auto generates indices
rbindlist(l, use.names=TRUE, fill=TRUE, idcol=TRUE)
# let's name the list
setattr(l, 'names', c("a", "b"))
rbindlist(l, use.names=TRUE, fill=TRUE, idcol="ID")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跑筝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞒滴,更是在濱河造成了極大的恐慌曲梗,老刑警劉巖赞警,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虏两,居然都是意外死亡愧旦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門定罢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笤虫,“玉大人,你說我怎么就攤上這事祖凫∏眚牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵惠况,是天一觀的道長遭庶。 經(jīng)常有香客問我,道長售滤,這世上最難降的妖魔是什么罚拟? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮完箩,結(jié)果婚禮上赐俗,老公的妹妹穿的比我還像新娘。我一直安慰自己弊知,他們只是感情好阻逮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秩彤,像睡著了一般叔扼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漫雷,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天瓜富,我揣著相機(jī)與錄音,去河邊找鬼降盹。 笑死与柑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓄坏。 我是一名探鬼主播价捧,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涡戳!你這毒婦竟也來了结蟋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤渔彰,失蹤者是張志新(化名)和其女友劉穎嵌屎,沒想到半個(gè)月后推正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宝惰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年舔稀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌测。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖产园,靈堂內(nèi)的尸體忽然破棺而出汞斧,到底是詐尸還是另有隱情,我是刑警寧澤什燕,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布粘勒,位于F島的核電站,受9級(jí)特大地震影響屎即,放射性物質(zhì)發(fā)生泄漏庙睡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一乘陪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡邑,春花似錦井赌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恰画,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨晴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工端盆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒋伦。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓痕届,卻偏偏與公主長得像末患,于是被迫代替她去往敵國和親研叫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚷炉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容