data.table

1.生成一个data.table对象

生成一个data.table对象,记为DT.

library(data.table)
:],V3=round(rnorm(),),V4=:)
DT
##     V1 V2      V3 V4
##  :    A  
##  :    B -
##  :    C -
##  :    A -
##  :    B  
##  :    C -
##  :    A -
##  :    B -
##  :    C  
## :    A -
## :    B -
## :    C -

2.通过i来筛选数据集的行

通过数字来筛选数据集的行

选取第三行到第五行

DT[:,] #or DT[:]
##    V1 V2      V3 V4
## :    C -
## :    A -
## :    B  

基于使用快速自动索引条件,使用列名选择行i

在V2这一列,选择所有值为A的行

DT[V2 == "A"]
##    V1 V2      V3 V4
## :    A  
## :    A -
## :    A -
## :    A -

选择多个值

选择在这一列中包含value1或value2的所有值

DT[column %in% c("value1","value2")]

选择V2这列中包含值A或C的所有行

DT[V2 %in% c("A","C")]
##    V1 V2      V3 V4
## :    A  
## :    C -
## :    A -
## :    C -
## :    A -
## :    C  
## :    A -
## :    C -

3.通过j来操作列

通过j来选择一列

DT[,V2]
##  [] "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" "B" "C"

注意到V2这一列是以向量的形式返回的

通过j来选择多列

DT[,.(V2,V3)]

##     V2      V3
##  :  A  :  B -:  C -:  A -:  B  :  C -:  A -:  B -:  C  :  A -:  B -:  C -0.7460

V2与V3这两列以data.table的形式返回

.()为list()的一个别名。如果使用.(),返回的为一个data.table对象。如果不使用.(),结果为返回一个向量。

在j上调用函数

DT[,sum(V1)]

## [] 

以向量的形式返回V1列中所有元素的总和

在多列上进行计算

以data.table的形式,返回V1这列的所有元素之和与V3这列的标准差

DT[,.(sum(V1),sd(V3))]

##    V1        V2
## :  0.4546055

指定计算列的列名

类似上例,但有一个新的列名

DT[,.(Aggregate = sum(V1), Sd.V3 = sd(V3))]

##    Aggregate     Sd.V3
## :         0.4546055

若列的长度不一,则会循环对齐

选择V1这一列,并计算V3这列的标准差,将会得到一个标准差的值并循环补齐

DT[,.(V1, Sd.V3 = sd(V3))]

##     V1     Sd.V3
##  :   :   :   :   :   :   :   :   :   :   :   :   0.4546055

多个表达式可以包裹在花括号中

输出V2这一列并绘制V3这一列

DT[,{print(V2) 
  plot(V3) 
  NULL}]

##  [] "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" "B" "C"

## NULL

4.根据分组来操作j

根据分组来操作j

对V1中的每一类来计算V4列的和

DT[,.(V4.Sum = sum(V4)),by=V1]

##    V1 V4.Sum
## :       
## :       

通过使用.()控制多个列来操作j

与上例类似,但每一个分组包含V1和V2两列

DT[,.(V4.Sum = sum(V4)),by=.(V1,V2)]

##    V1 V2 V4.Sum
## :    A      
## :    B     
## :    C     
## :    A     
## :    B     
## :    C     

在by中调用函数

以sign(V1-1)为分组,计算各个分组中V4列的和:

DT[,.(V4.Sum = sum(V4)),by=sign(V1-)]

##    sign V4.Sum
## :         
## :         

通过指定i行子集的分组进行操作

在前5行数据集中,通过V1列的分组来计算V4列的总和:

DT[:,.(V4.Sum = sum(V4)),by=V1]

##    V1 V4.Sum
## :        
## :        

使用函数.N来得到每个类别的总观测数

在V1列中计算每个分组的观测数

DT[,.N,by=V1]

##    V1 N
## :   
## :   

5.使用:=引用来添加或更新一列

在一行中使用:=引用来添加或更新列.

注意: 额外的指定 (DT <- DT[…])是多余的 使用:=来更新V1列:

DT[, V1 := round(exp(V1),)]

这段代码没有显式的返回结果,而V1列从[1] 1 2 1 2 … 变成了 [1] 2.72 7.39 2.72 7.39 …

使用:=引用来添加或更新多列

使用:=更新V1列和V2列:

DT[, c(), LETTERS[:])]

同样没有显式的返回结果,V1列的结果与上相同,V2列从[1] “A” “B” “C” “A” “B” “C” … 变成: [1] “D” “E” “F” “D” “E” “F” …

使用函数:=

上例的另一种写法,但会在书写时更易并齐。而且,当添加[]时,结果会返回在屏幕中

DT[, ),V2 = LETTERS[:])][]

##          V1 V2      V3 V4
##  :   D  
##  :     Inf  E -
##  :   F -
##  :     Inf  D -
##  :   E  
##  :     Inf  F -
##  :   D -
##  :     Inf  E -
##  :   F  
## :     Inf  D -
## :   E -
## :     Inf  F -

与上例变化相同,但是由于在语句最后添加了[],这一结果会返回至屏幕

通过使用:=来移除一列

移除V1列

DT[, V1 := NULL]

无显式的返回结果,但V1列变为NULL

通过使用:=来移除多列

移除V1列与V2列

DT[, c("V1","V2") := NULL]

## Warning in `[.data.table`(DT, , `:=`(c("V1", "V2"), NULL)): Adding new
## column 'V1' then assigning NULL (deleting it).

无显式的返回结果,但V1列与V2列变为NULL

将一个包含列名的变量用小括号包裹起来,变量所传递的内容将会被删除

注意:列名为Cols.chosen的列将会被删除,这里不是删除“V1”,“V2”列

Cols.chosen = c("V1","V2")
DT[, Cols.chosen := NULL]

## Warning in `[.data.table`(DT, , `:=`(Cols.chosen, NULL)): Adding new column
## 'Cols.chosen' then assigning NULL (deleting it).

无显式的返回结果,列名为Cols.chosen的列将会被删除

删除指定变量Cols.chosen包含的V1列和V2列

DT[, (Cols.chosen) := NULL]

## Warning in `[.data.table`(DT, , `:=`((Cols.chosen), NULL)): Adding new
## column 'V1' then assigning NULL (deleting it).

## Warning in `[.data.table`(DT, , `:=`((Cols.chosen), NULL)): Adding new
## column 'V2' then assigning NULL (deleting it).

无显式的返回结果,列名为V1和V2的列变为NULL?

索引与键值

使用setkey()函数设置键值

setkey()函数可以在数据集DT上设置键值。当我们设置好key后,data.table会将数据按照key来排序。 在V2列上设置一个键值

:],V3=round(rnorm(),),V4=:)
DT

##     V1 V2      V3 V4
##  :    A  
##  :    B -
##  :    C -
##  :    A -
##  :    B  
##  :    C -
##  :    A -
##  :    B -
##  :    C  
## :    A -
## :    B -
## :    C -

setkey(DT,V2)

无显示返回结果

使用键值来选择行

使用键值可以更加有效地选择行,由于已将V2设置了键值,将会返回该列中所有包含变量值A的行

DT[:    A  
## :    A -
## :    A -
## :    A -

返回键值所在列(V2列)包含变量值A或变量值C的所有行

DT[c(:    A  
## :    A -
## :    A -
## :    A -
## :    C -
## :    C -
## :    C  
## :    C -

mult参数

mult参数是用来控制i匹配到的哪一行的返回结果默认情况下会返回该分组的所有元素

返回匹配到键值所在列(V2列)所有行中的第一行

DT[:    A 

返回匹配到键值所在列(V2列)所有行中的最后一行

DT[:    A -

nomatch参数

nomatch参数用于控制,当在i中没有到匹配数据的返回结果,默认为NA,也能设定为0。0意味着对于没有匹配到的行将不会返回。 返回匹配到键值所在列(V2列)所有包含变量值A或D的所有行:

DT[c(:    A  
## :    A -
## :    A -
## :    A -
## : NA  D      NA NA

变量值A匹配到了,而变量值D没有,故返回NA。

返回匹配到键值所在列(V2列)所有包含值A或D的所有行:

DT[c(]

##    V1 V2      V3 V4
## :    A  
## :    A -
## :    A -
## :    A -

因为nomatch参数,值D没有匹配到故不返回。

by=.EACHI参数

by=.EACHI允许按每一个已知i的子集分组,在使用by=.EACHI时需要设置键值

返回键值(V2列)中包含A或C的所有行中,V4列的总和。

DT[c(] 

返回键值所在列(V2列)中包含A的行在V4列总和与包含C的行在V4列的总和。

DT[c(:  A 
## :  C 

使用setkey()设置一个多列主键

任意列都能使用setkey()来设置主键,这种方式可以选择2个列作为一个主键。以下是一个等值连接V1列的每个组先根据V1排序,再根据V2排序。

setkey(DT,V1,V2)

无显式返回结果

选择键值1(V1列)为2且键值2(V2列)为C的行。

DT[.(,:    C -
## :    C -

选择键值1(V1列)为2且键值2(V2列)为A或C的行

DT[.(,c(:    A -
## :    A -
## :    C -
## :    C -

6.data.table高级操作

.N

.N可以用来表示行的数量或者最后一行

在i处使用:

DT[.N-]

##    V1 V2      V3 V4
## :    C -

返回每一列的倒数第二行 在j处使用:

DT[,.N-]

## [] 

返回倒数第二行所在的行数。 ### .()

.()是list()的一个别名,他们在data.table中是等价的。当只有一个元素的位置j或者by中,是不需要.()的。

在j中使用:

DT[,.(V2,V3)] #or DT[,list(V2,V3)]

##     V2      V3
##  :  A  :  A -:  B  :  B -:  C -:  C  :  A -:  A -:  B -:  B -:  C -:  C -0.7460

在by中使用:

DT[, mean(V3),by=.(V1,V2)]

##    V1 V2       V1
## :    A -:    B -:    C -:    A -:    B -:    C -0.72465

以V1,V2为分组,对V3求均值 ### .SD参数

.SD是一个data.table,他包含了各个分组,除了by中的变量的所有元素。.SD只能在位置j中使用:

DT[, print(.SD), by=V2]

##    V1      V3 V4
## :    
## :   -
## :   -
## :   -
##    V1      V3 V4
## :    
## :   -
## :   -
## :   -
##    V1      V3 V4
## :   -
## :    
## :   -
## :   -

## Empty data.table ( rows) of  col: V2

以V2为分组,选择每组的第一和最后一列:

DT[,.SD[c(,.N)], by=V2]

##    V2 V1      V3 V4
## :  A    
## :  A   -
## :  B    
## :  B   -
## :  C   -
## :  C   -

以V2为分组,计算.SD中所有元素的和:

DT[, lapply(.SD, sum), by=V2]

##    V2 V1     V3 V4
## :  A   -
## :  B   -
## :  C   -

.SDcols

.SDcols常于.SD用在一起,他可以指定.SD中所包含的列,也就是对.SD取子集:

DT[, lapply(.SD,sum), by=V2,.SDcols = c(:  A -
## :  B -
## :  C -

.SDcols也可以是一个函数的返回值:

DT[, lapply(.SD,sum), by=V2,.SDcols = paste0(:)]

##    V2     V3 V4
## :  A -
## :  B -
## :  C -

结果与上一个是相同的。

7.串联操作可以把表达式聚合在一起并避免多余的中间变量

把多个操作串联起来,这等价于SQL中的having

:],V3=round(rnorm(),),V4=:)
DT<-DT[, .(V4.Sum = sum(V4)),by=V1]
DT[V4.Sum > ] #no chaining

##    V1 V4.Sum
## :       
## :       

这个是不使用串联的方法,先以V1为分组,对V4求和,然后再把分组总和大于35的取出来。 使用串联的方法:

DT <- data.table(V1=c(:],
                 V3=round(rnorm(),),
                 V4=:)
DT[, .(V4.Sum = sum(V4)),by=V1][V4.Sum >  ]

##    V1 V4.Sum
## :       
## :       

分组求和之后对V1进行排序:

DT[, .(V4.Sum = sum(V4)),by=V1][order(-V1)]

##    V1 V4.Sum
## :       
## :       

8.使用set()家族

set()

set()通常用来更新给定的行和列的值,要注意的是,他不能跟by结合使用。

DT <- data.table(V1=c(:],
                 V3=round(rnorm(),),
                 V4=:)
rows = list(:,:)
cols = :
:    A  
##  :    B -
##  : NA  C -
##  : NA  A  
##  :   NA  
##  :   NA -
##  :    A -
##  :    B  
##  :    C  
## :    A -
## :    B -
## :    C  

以上程序把给定的一组行和列都设置为了NA ### setname()

与set()同理,setname()可以修改给定的列名和行名,以下程序是

# 把名字为:     A  
##  :     B -
##  :  NA  C -
##  :  NA  A  
##  :    NA  
##  :    NA -
##  :     A -
##  :     B  
##  :     C  
## :     A -
## :     B -
## :     C  

# 把:            A      
##  :            B     -
##  :  NA         C     -
##  :  NA         A      
##  :           NA      
##  :           NA     -
##  :            A     -
##  :            B      
##  :            C      
## :            A     -
## :            B     -
## :            C      

setcolorder()

setcolorder()可以用来修改列的顺序。

DT <- data.table(V1=c(:],
                 V3=round(rnorm(),),
                 V4=:)
setcolorder(DT,c(:  A      :  B      :  C      :  A     -:  B      :  C      :  A      :  B     -:  C      :  A     :  B     :  C    -0.2730

原文来自DataCamp课程的data.table官方速查表 原文链接:https://www.datacamp.com/community/tutorials/data-table-cheat-sheet

本文转载自雪晴数据网(有修改):http://www.xueqing.tv/cms/article/246


转载请注明本文链接:http://www.cnblogs.com/homewch/p/5683589.html

//

//

data.table包的更多相关文章

  1. R语言数据分析利器data.table包 —— 数据框结构处理精讲

        R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...

  2. data.table包简介

    data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ...

  3. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...

  4. 使用 data.table 包操作数据

    在第一节中,我们回顾了许多用于操作数据框的内置函数.然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便.然而,两种方法都有各自的局限性.使用内置函数可能既繁琐又缓慢,而相对于各式各 ...

  5. R语言data.table包fread读取数据

    R语言处理大规模数据速度不算快,通过安装其他包比如data.table可以提升读取处理速度. 案例,分别用read.csv和data.table包的fread函数读取一个1.67万行.230列的表格数 ...

  6. R语言数据分析利器data.table包—数据框结构处理精讲

    R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...

  7. data.table包使用应该注意的一些细节

    fread中nThread 参数的使用   注意默认nThread=getDTthreads(),即使用所有能用的核心,但并不是核心用的越多越好,本人亲自测试的情况下,其实单核具有较强的性能,只有在数 ...

  8. R读取大数据data.table包之fread

    >library(data.table)>data=fread("10000000.txt")>Read 9999999 rows and 71 (of 71) ...

  9. R语言学习笔记(十七):data.table包中melt与dcast函数的使用

    melt函数可以将宽数据转化为长数据 dcast函数可以将长数据转化为宽数据 > DT = fread("melt_default.csv") > DT family_ ...

随机推荐

  1. 字典树(codevs 4189)

    4189 字典  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 最经,skyzhong得到了 ...

  2. wireshark_Couldn’t run /usr/sbin/dumpcap in child process: Permission denied

    关于Wireshark出现:Couldn't run /usr/sbin/dumpcap in child process: Permission denied Are you a member of ...

  3. 【转】C语言快速幂取模算法小结

    (转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...

  4. Tomcat在Linux上的安装与配置

    以下使用的Linux版本为: Redhat Enterprise Linux 6.5 x86_64,Tomcat版本为tomcat-7.0.54. 1.下载JDK与Tomcat.    jdk下载地址 ...

  5. 二、JavaScript语言--JS实践--商城分类导航效果

    商城类导航菜单制作(以京东为例--竖向列表横向伸缩) 可以用两种方式来实现:用CSS实现和用JS实现 方法一:用CSS实现(要点:使用hover) <!DOCTYPE html PUBLIC & ...

  6. Java Eclipse进行断点调试

    如何调试Java程序? 大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了. 下文会尽量简单直观的教会你在Eclipse中调试,其他的IDE调试步骤也是类似的. 1.在你觉得有错的地 ...

  7. CPU工作状态的知识介绍

    转自:http://www.bbwxbbs.com/forum.php?mod=viewthread&tid=2552   近几年,个人计算机的运行速度有了质的飞跃,但是功耗却没能与时俱进,着 ...

  8. 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法

    尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...

  9. MS SQL 合并结果集并求和 分类: SQL Server 数据库 2015-02-13 10:59 92人阅读 评论(0) 收藏

    业务情景:有这样一张表:其中Id列为表主键,Name为用户名,State为记录的状态值,Note为状态的说明,方便阅读. 需求描述:需要查询出这样的结果:某个人某种状态的记录数,如:张三,待审核记录数 ...

  10. C# Settings使用小结

    本篇博客将介绍C#中Settings的使用. 首先介绍一个桌面程序中的例子,当我们新安装一个软件,软件启动后会有例如新手指导等窗体弹出来,每次都需要自己去关闭它.当然这些软件都会提供例如不再显示等功能 ...