data.table笔记1

作者: 茶苯海 | 来源:发表于2018-01-23 14:44 被阅读27次

    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")
    

    相关文章

      网友评论

        本文标题:data.table笔记1

        本文链接:https://www.haomeiwen.com/subject/vyysaxtx.html