【R语言】必学包之data.table包

      R语言具有较强的数据分析能力,但是对于数据处理,尤其是面对较大数据量时,就有很多的不足之处,为了解决处理较大数据集的问题,R中涌现了一系列数据处理的包,data.table包就是其中之一。data.table是对data.frame的扩展类型,因此适用于data.frame的函数也同样适用于data.table,不同的是data.table增加了索引设置,数据处理效率更高,能够快速地进行数据读取,聚合排序以及分组运算等。 

1)data.table对象

     可以使用data.table直接转换数据框为data.table类型。其中变量key是列名组成的向量,用于设置索引列。另外不同于data.frame,字符类型的列默认不会转换为因子类型(stringsAsFactors=FALSE) 。as.data.table和setDT也可用于转换list和data.frame为data.table对象,不同的是前者会完全复制原对象,然后进行转换,而后者是直接操作原数据集,因此前者更加的耗时和耗内存。

data.table(..., keep.rownames=FALSE, check.names=FALSE, key=NULL, stringsAsFactors=FALSE)
setDT(x, keep.rownames=FALSE, key=NULL, check.names=FALSE)
as.data.table(x, keep.rownames=FALSE, ...) 
例 1 :
#转换为data.table对象
dt1 <- data.table(mtcars)
dt_as1 <- as.data.table(mtcars)
#转换为data.table对象,保留原数据框行名称
dt2 <- data.table(mtcars, keep.rownames = TRUE)
dt_as2 <- as.data.table(mtcars, keep.rownames = TRUE)
#转换为data.table对象,建立索引在cyl列上
dt3 <- data.table(mtcars, key = "cyl")
#返回逻辑值,查看dt对象是否存在索引
haskey(dt3)
#使用key函数可以得到dt对象上的索引列,没有索引列返回NULL
key(dt3)
#返回内存中所有的data.table对象,包括行数,列名和索引列
tables()
例 2 :
#转换list为data.table, 自动填充列名
X = list(1:4, letters[1:4])
setDT(X)
#转换list为data.table, 并在变量a上创建key
X = list(a = 4:1, b=runif(4))
setDT(X, key="a")
key(X)
NOTE:  data.table中的set*系列函数以及操作符“:=”都是直接对原数据进行修改。
2)data.table操作   

     对于数据的处理,data.table包提供了一个非常简洁的通用格式:DT[i, j , by],其表示的含义为对数据集 DT,选取子集行 i , 通过 by 分组计算 j 

DT[i, j, by, keyby, with = TRUE,
    nomatch = getOption("datatable.nomatch"),                          
    mult = "all",
    roll = FALSE,
    rollends = if (roll=="nearest") c(TRUE,TRUE)
                 else if (roll>=0) c(FALSE,TRUE)
                 else c(TRUE,FALSE),
    which = FALSE,
    .SDcols,
    verbose = getOption("datatable.verbose"),                           
    allow.cartesian = getOption("datatable.allow.cartesian"),   
    drop = NULL, on = NULL]
  • i,设定数据的选取条件;
  • j,设定结果的计算方式,j 的计算输出为list(使用list()或者.())时,整个操作输出为data.table对象,并且data.table的每一列对应着list的每一个元素, j为非list输出时,返回为向量对象;如果i为data.table对象,j中可以”i. ”为前缀调用对象 i 的列,如X[Y, .(val, i.val)],val为X中的列,i.val为Y中的列。以“x.”为前缀可以调用DT对象中的列,如X[Y, .(x.a - i.a, b), on="a"]。j 中也可以使用一些特殊的只读符号:.SD, 为一个data.table对象,包含DT对象中每个分组的子集,默认包含除分组变量外的所有变量;.N, 为整数,可用于 i 和 j,用于返回每组的记录数;.I, 为数值向量,等于seq_len(nrow(x)),分组时用于返回记录在原dt中的行号;.GRP, 为数值向量,返回每个分组的组号;.BY, 为list对象,对应by中每个元素;
  • by,设定数据的分组情况;
  • keyby, 和by类似,不同的是会对结果执行setkey() 函数,返回排序后的结果,默认升序排列;
  • with, 逻辑值,当为TRUE时,j所表示的列名被视为变量,除了可用于筛选列外还可以用于计算;为FALSE时,j为字符向量所表示的列名或者是数值向量用于选择列;
  • nomatch,当 i 在DT中没有匹配值时,返回nomatch的默认值NA。设置nomatch为0,不返回匹配的行;
  • mult, 当 i 在DT中匹配多个值时,mult用于设置返回的记录,默认all返回所有匹配记录,first返回第一条匹配的记录,last返回最后一条匹配的记录;
  • .SDcols,与.SD一起使用,用于选择输出列;
  • verbose, 为TRUE会在控制台输出相应的状态和信息;
  • which,为FALSE(默认值)时返回DT中与 i 匹配的值,TRUE返回匹配元素的行号,NA返回不匹配元素的行号;
  • on,列名用于join对象 i 和 DT;
例 1 :
#转换为data.table对象
dt <- data.table(mtcars)
#以cyl分组,返回每组最大的mpg值
dt[, max(mpg), by=cyl]
#以cyl分组,返回每组最大的mpg值,返回的结果按cyl排序
dt[, max(mpg), keyby=cyl]
dt[, max(mpg), by=cyl][order(cyl)]
例 2 :
dt <- data.table(mtcars)
#j为向量形式,返回向量
dt[, c(mpg, cyl)]
#j为list,返回data.table对象
dt[, .(mpg, cyl)]
dt[, list(mpg, cyl)]
#计算cyl = 4的所有记录的mpg的和,返回向量
dt[cyl == 4, sum(mpg)]
#计算cyl = 4的所有记录的mpg的和,返回data.table
dt[cyl == 4, .(sum(mpg))]
例 3 :
dt <- data.table(mtcars)
#选择变量cyl
dt[, cyl]
#选择变量cyl,速度更快
dt[["cyl"]]
#with为FALSE时选择变量,j为字符串或数值
dt[, "cyl", with = FALSE]
dt[, 2, with = FALSE]
例 4 :
dt_rn <- data.table(mtcars, keep.rownames = TRUE)
dt_rn[cyl == 4, ]
#筛选记录等同于cyl == 4
dt_rn[.(4), on = "cyl"]
dt_rn[.(4), on = .(cyl)]
dt_rn[list(4), on = "cyl"]
#筛选记录等同于cyl == 4,返回匹配的第一条记录
dt_rn[.(4), on = "cyl", mult = "f
  • 24
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值