欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

data.table使用2

程序员文章站 2022-05-18 17:15:38
...

R语言数据表的使用2

  上期的data.table简述了创建、横向记录过滤、纵向字段计算和字段分组汇总问题,其中涉及用list()或者.()的快速过滤的方法。这次继续论述data.table的关键字Key(和SQL中的索引一样),还有数据连接问题。

5.索引

  一直以来,我都把索引看做是主键的翻版,因为在SQL的关系表中,主键只能有一个,但是索引是可以随心设置,索引的作用举个例子就明白了。在3个变量且10条记录的数据中,我们的横向数据过滤和纵向的字典计算(两者都包含着[]筛选条件使用),在数据框中逐个数据的检索,而使用索引的话,就会利用索引先创建出一个二叉搜索树,极大提高搜索速度。在数据框中没有索引这个功能,但是在数据表data.table中具有个功能就是setkey()和J()。

5.1 设置索引(setkey)

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 使用索引

#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"]                           

6.使用key合并数据

#新建一个数据表
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"]                       

7.使用key修改数据

  值得注意的是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