data.table包
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
//
//
data.table包的更多相关文章
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...
- data.table包简介
data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ...
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
- 使用 data.table 包操作数据
在第一节中,我们回顾了许多用于操作数据框的内置函数.然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便.然而,两种方法都有各自的局限性.使用内置函数可能既繁琐又缓慢,而相对于各式各 ...
- R语言data.table包fread读取数据
R语言处理大规模数据速度不算快,通过安装其他包比如data.table可以提升读取处理速度. 案例,分别用read.csv和data.table包的fread函数读取一个1.67万行.230列的表格数 ...
- R语言数据分析利器data.table包—数据框结构处理精讲
R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...
- data.table包使用应该注意的一些细节
fread中nThread 参数的使用 注意默认nThread=getDTthreads(),即使用所有能用的核心,但并不是核心用的越多越好,本人亲自测试的情况下,其实单核具有较强的性能,只有在数 ...
- R读取大数据data.table包之fread
>library(data.table)>data=fread("10000000.txt")>Read 9999999 rows and 71 (of 71) ...
- R语言学习笔记(十七):data.table包中melt与dcast函数的使用
melt函数可以将宽数据转化为长数据 dcast函数可以将长数据转化为宽数据 > DT = fread("melt_default.csv") > DT family_ ...
随机推荐
- SQLServer自定义函数简单演示
CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] par ...
- Git命令之从GitHub上下载开源项目
1,先在本地创建一个目录,作为本地仓库,如: 2,使用Git init 初始化仓库,git初始化完成后,会生成一个隐藏的git文件如: 3,clone Git项目,如: 4,这个项目就是合Github ...
- AFNetworking(AFN)总结
AFNetworking(AFN) ----主要做下载上传之用 //他是干啥的?发送请求,主要做下载上传之用 (苹果自带有获取服务器数据的方法NSURLConnection send,AFNetwor ...
- 55. Jump Game leetcode
55. Jump Game Total Accepted: 95819 Total Submissions: 330538 Difficulty: Medium Given an array of n ...
- 手机的ROM,RAM是各自存放什么?所谓“运行内存”和“机身内存”究竟有什么区别?
手机的内存分为运行内存(RAM)和非运行内存(也叫机身内存.储存空间.ROM) 1.手机的内存,分为存储内存和运行内存,相当于电脑的硬盘和内存条.2.存储内存分为机身内存和存储卡.3.rom是存储内存 ...
- 【Java EE 学习 20】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】
一.使用过滤器实现登录验证.权限认证 1.创建5张表 /*使用过滤器实现权限过滤功能*/ /**创建数据库*/ DROP DATABASE day20; CREATE DATABASE day20; ...
- 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端
这应该是继我研究手册QQ协议后的第2个稍微正式一点的网络程序, 不只是Scoket套接字编程, 还涉及到更多的HTTP协议知识! 阿里云开放储存服务OSS官方已经提供了不少SDK, 包括PHP/Pyt ...
- VC++中字符串编码的转换
在以前VC++6.0中默认的字符集是多字节字符集(MBCS:Multi-Byte Character Set),而VS2005及以后默认的字符集是Unicode,这样导致以前在VC6.0中非常简单实用 ...
- Socket编程注意接收缓冲区大小
转自:http://www.cnblogs.com/ITBread/p/3900254.html 最近在做一个udp升级程序,因文件有点大,需要将程序分成多个包发送,每次发送一个包,收到回复后发送下一 ...
- jQuery.fn.extend与jQuery.extend到底区别在哪?
正文: 其实说白了,从两个方法本身就能看出来端倪. 我们先把jQuery看成了一个类,这样好理解一些. jQuery.extend(),是扩展的jQuery这个类. 假设我们把jQuery这个类看成是 ...