R语言必学包之data.table包

本文详细介绍了R语言中的data.table包,它作为data.frame的扩展,提供了更高效的大型数据集处理能力。文章通过实例演示了如何创建、操作和筛选data.table对象,包括设置索引、数据选择、排序、过滤、变形和关联操作。此外,还对比了data.table与data.frame的性能,并探讨了设置key和index对查询性能的影响,强调了在特定场景下使用index的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/wltom1985/article/details/61926958
      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 = “first”]
#筛选记录等同于cyl == 4,返回匹配的最后一条记录
dt_rn[.(4), on = “cyl”, mult = “last”]
#筛选行名称为Toyota Corona的记录
dt_rn[“Toyota Corona”, on = .(rn)]
例 5 :
dt <- data.table(mtcars)
#返回dt的最后一条记录
dt[.N]
#返回dt的记录数
dt[, .N] 
nrow(dt)
#根据cyl分组,返回每个分组的记录数
dt[, list(total=.N), by = cyl]
dt[, .N, by = cyl]
#选取hp到vs的所有列
dt[, .SD, .SDcols = hp:vs]
#返回第一行记录
dt[, .SD[1]]
#返回以cyl分组后的每组的第一条记录
dt[, .SD[1], by = cyl]
#以cyl分组,并对返回列求和,以及返回每组记录数
dt[, c(.N, lapply(.SD, sum)), by=cyl, .SDcols = hp:vs]
#返回以cyl分组后的每组第一条记录的行号
dt[, .I[1], by = cyl]
#为对象dt添加组号
dt[, grp := .GRP, by=cyl] 
3)筛选: filter
     data.table可以和data.frame一样进行方便的数据筛选操作,可以使用行号,或者多个条件语句的组合进行数据筛选。

例 1 :
#转换为data.table对象,并保留行名称
dt_rn <- data.table(mtcars, keep.rownames = TRUE)
#按行号筛选数据,‘,’为可选项,而在data.frame中是不可省略的
dt_rn[3]
dt_rn[3:2]
dt_rn[3:2,]
#使用’!’或者’-‘号剔除数据
dt_rn[!3:2]
dt_rn[-(3:2)]
#以mpg排序,order返回的为行号
dt_rn[order(mpg)]
dt_rn[order(mpg),]
#返回cyl为4的所有记录
dt_rn[cyl == 4]
#返回cyl为4和6的所有记录
dt_rn[cyl %in% c(4,6)]
#’&’连

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值