data.table使用2
程序员文章站
2022-05-18 17:15:38
...
上期的data.table简述了创建、横向记录过滤、纵向字段计算和字段分组汇总问题,其中涉及用list()或者.()的快速过滤的方法。这次继续论述data.table的关键字Key(和SQL中的索引一样),还有数据连接问题。
一直以来,我都把索引看做是主键的翻版,因为在SQL的关系表中,主键只能有一个,但是索引是可以随心设置,索引的作用举个例子就明白了。在3个变量且10条记录的数据中,我们的横向数据过滤和纵向的字典计算(两者都包含着[]筛选条件使用),在数据框中逐个数据的检索,而使用索引的话,就会利用索引先创建出一个二叉搜索树,极大提高搜索速度。在数据框中没有索引这个功能,但是在数据表data.table中具有个功能就是setkey()和J()。
library(data.table)
#示例操作
DT <- data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
# (deep) copy DT to kDT to work with it.
#复制一份DT数据,命名为KDT
kDT <- copy(DT)
kDT
# set a 1-column key. No quotes, for convenience.
#设置一列索引,就是kDT中的x
setkey(kDT,x)
# same (v in setkeyv stands for vector)
#同上
setkeyv(kDT,"x")
#设置两列索引
# multi-column key
# 2-column key
setkey(kDT,x,v)
setkeyv(kDT,c("x","y"))
#查看数据表中已经设置的索引
key(kDT) # "x"
#5.2.1使用一个索引
# subset-as-join on *key* column 'x'
kDT["a"]
# same, being explicit using 'on=' (preferred)
#这个on是作者推荐的方式
kDT["a", on="x"]
#5.2.2使用多个索引
#索引的使用类似于表联结,这里一定要注意下面四种使用索引方法的不同!!!
setkey(kDT,x,y)
# join to 2 columns #如果检索值在字段中,这样使用list的.()形式检索最快,这样也最好
kDT[.("a", 3)]
# remove missing
#!!!!如果你不清楚是不是在这个字段中,请加上nomatch=0,以减少NA值
kDT[.("a", 3:6), nomatch=0]
# join 4 rows (2 missing)
kDT[.("a", 3:6)]
# 否定检索
kDT[!"a"]
#新建一个数据表
X <- data.table(x=c("c","b"), v=8:7, foo=c(4,2))
X
#1.内联结,只保存匹配到的值
# inner join
DT[X, on="x", nomatch=0]
# 2.left join 左联结 #以索引键进行联结,左表不变,右表添加过来,没有对应值,则为NA
#索引值不变,存在NA的结果
X[DT, on="x"]
# 3.right join
#可以理解为在DT中以x搜索X数据中的值进行匹配
#因为X数据中的x是DT数据的x的子集,所以这里没有NA值
DT[X, on="x"]
# 4. not join 非联结
DT[!X, on="x"]
值得注意的是R中的数据修改通常是需要用[]进行命中数据进行的,如果要批量的进行数据修改,就需要用for循环,或者是lapply等向量化的函数。在数据表中,我们可以用符号:=来修改数据,或者添加数据。
#7.1 这样的修改,就把v中的数据全部修改成为了5
#加上print是为了直接输出,以免还得写X
X[,v:=5]
X
#7.2 加入过滤条件修改!!!!!!
#修改x列中的a对应的v值为42L
DT["a", v:=42L, on="x"]
#7.3 add new column by reference
#像这样,这需要用新的列名,就是添加了一个新列,不用transform
DT[, z:=42L]
DT
#7.4 remove column by reference
#这样是删除一列
DT[, z:=NULL]
DT