data.table笔记1

dplyr包,该包类似于SQL的一套语法规则的确帮助我们快速的进行数据筛选、排序等功能,那dplyr包已经如此便捷的情况下,为什么还要学习data.table包呢?

一方面,data.table所使用的代码量更少,效率更高,特别是在处理大至GB级别的数据时,它比dplyr以及python的pandas处理数据都要快;
另一方面,快速地数据读取,快速地聚合排序,快速地分组运算,以及灵活自然的语法,使得data.table可以称之为加强版data.frame,因而适用于data.frame的函数也适用于data.table。

首先我们来看data.table和data.frame的区别:

1.与data.frame不同,在生成data.table的时候character类型的数据不会默认地转换成factors类型,这样的好处就是你不用再在语句中每次都添加'stringsAsFactors = FALSE'了。

2.打印数据时在行号后面加了一个冒号:用以区分行号与第一列数据。

3.当数据行数超过options()参数设置datatable.print.nrows的值时(默认值为100),仅仅只会打印该数据集的前5行以及最后5行的数据。

4.data.table没有行名称。


data.table语法的一般形式
调用公式:

# 对于数据集DT,选取子集行i,通过by分组计算j
> DT[i,j,by]

数据处理
1.数据筛选
(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函数,调用公式为:

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

3.数据排序 setorder()

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

4.增删变量
(1)增加变量的调用公式

# 单变量添加
DT[i,LHS := RHS,by = ...]
# LHS为新建的变量,RHS为该变量的计算方式

# 双变量添加
> 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指定计算函数即可

# 单一分组汇总
head(mtcars_dt[,.(mean_mpg = mean(mpg),num = length(mpg),sum_disp = sum(disp)),by = cyl])
#多分组汇总 list函数的运用

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

dplyr也可以多个by.

data.table有个特殊的变量.N 可以直接计算分组

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

6.数据合并

## 数据合并仍然采用merge函数,只是合并对象必须是data.table类型,这样才能发挥出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)快速查找某一区间%between%

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

区间这个地方比 filter函数方便

(2)判断两个数据框是否相同 all.equal

# 返回逻辑向量,有主键时,对主键列做是否重复判断;无主键时,对所有列做判断。
# 利用此函数,我们就可以轻松地对数据去重。
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)

其他函数

读取文件函数: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")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容