在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快。包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部处理的步骤进行了程序上的优化,使用多线程,甚至很多函数是使用C写的,大大加快数据运行速度。因此,在对大数据处理上,使用data.table无疑具有极高的效率。这里主要介绍在基因组数据分析中可能会用到的函数。
fread 做基因组数据分析时,常常需要读入处理大文件,这个时候我们就可以舍弃read.table,read.csv等,使用读入速度快的fread函数 fread(input, sep="auto", sep2="auto", nrows=-1L, header="auto", na.strings="NA", file,
input 输入的文件,或者字符串(至少有一个"\n"); 可见1.8GB的数据读入94秒,读入文件速度非常快
fwrite
对数据框数据进行处理后,需要保存到文件,我们就可以使用fwrite多线程写出,速度特别快
fwrite(x, file = "", append = FALSE, quote = "auto",
x 具有相同长度的列表,比如data.frame和data.table等;
和reshape2包的dcast一样, 这个函数用来重铸表格,并且再在大数据的处理上,比reshape2的内存更优化,函数效果如下
原表格 铸造后(v4作为value)
dcast(data, formula, fun.aggregate = NULL, sep = "_", data 一个data.table; formula 要铸造的表格的LHS~RHS格式;LHS和RHS可以是"..."和“.",其中"..."代表全部变量,"."代表无变量; fun.aggregate 是否在铸造之前汇总,应提供函数list(比如mean,sum或者c(sum,mean)),默认length; sep 铸造的时候连接字符变量的连接符,默认_; subset 指定要铸造的子集;利用; margins 函数尚不能应用(作者还没写好),预计设定编辑汇总方向; fill 填充缺失值; drop 设置成FALSE显示没有联合成功的行列 value.var 填充值的列,默认会猜测 现在我需要取数据DT的v1,v2两列相同的情况作为汇总的一类,对它们的v4值取平均,转换如下,
转换前 转换后 当然,上述过程也可以用data.table[ i , j , by ]语法做 但是如果我要将上述DT中的v3作为一个影响因素,作为tag,先按v1、v2汇总,再将对应的v4值分为v3=1和v3=2两类,查看v1、v2取值相同v3不同对应v4的情况,这个时候用dcast或者会更加方便,如下
melt 和reshape2包的melt一样,融合表格,这个是用C语言写的,处理速度更快。 处理前: 处理后:
melt(data, id.vars, measure.vars, data data.table对象; id.vars id变量组成的矢量,可以对应列号,也可以对应列名;缺失的话,非测量变量会被赋值; measure.vars 测量变量组成的是矢量或者列表,可以对应列号和列名,也支持pattern函数,下面会提到,如果缺失,非id变量会被赋值;如果measure.vars和id.vars都没有赋予,全部非数字列会作为id.vars,剩余作为measure.vars;如果measure变量不是同一种类型,那么会被强制转换,等级如下list > character > numeric > integer > logical; variable.name 测量变量列名,默认"variable"; value.name 融合后数据的数值列名; na.rm 如果TRUE,移除NA值; variable.factor 如果TRUE,变量列转化为因子; verbose 如果TRUE,在工作台产生交互信息,默认options(datatable.verbose=TRUE)
对于前面的DT,我现在将f和d开头的列名的列作为测量变量,如下
pattern函数下面会讲,这里再讲一下的是melt和dcast的联合使用,先用melt融合,再用dcast重铸 如下面例子 原DT
melt 后 再进行dcast后 其实上述过程用data.table [ i , j , by ]语法也可以 看个人需要吧,各种各样不同的方法都了解了以后,当你真正需要用到达到某个目的时,你的脑海里就会自动匹配上最佳的处理方法。
patterns patterns是melt函数内部使用的函数,匹配正则表达式。melt的时候可以用正则去匹配列名 patterns(..., cols=character(0)) ... 正则表达式集; cols 要匹配的字符矢量; 例子在讲melt函数的时候已有
rbindlist 类似于data.frame的rbind,不过比rbind的速度更快,并且总是返回data.table。也有不同之处,一是use.names参数,可以指定是否使用相同列名bind,二是rbindlist可以使用在不知道对象名字的情况下,比如lapply(fileNames, fread) 。 rbindlist(l, use.names=fill, fill=FALSE, idcol=NULL) l 对象列表,也可以分开写 use.names 如果TRUE, bind的时候匹配行名,默认FALSE,像rbind一样,直接bind,当时TRUE的时候,至少要有一个对象的一列要存在行名; fill 如果TRUE,缺失的列用NA填充,这个时候bind的对象可以不同列数,并且use.names自动设为TRUE,这个时候至少要有一个对象的一列要存在行名; idcol 产生一个index列,默认(NULL)不产生,如果idcol=TRUE,行名自动为.id,当然你也可以直接命名,比如idcol="id";
between 是data.table i 语法的扩展功能,between等同于x >= lower 并且 x <= upper 当incbounds设置为TRUE的时候,设置为FALSE的时候则是x > lower 并且 x < upper between(x, lower, upper, incbounds=TRUE) x 任意的可以排序的矢量,可以用"<="比较的 lower 较低的范围; upper 较高的范围; y 长度为2的矢量或者列表,y[1] 相当于lower,y[2] 相当于upper; incbounds 如果TRUE意味着包括边界,即<=或者>= ,默认TRUE; 例如有基因组注释文件如下
我想取出在chr1上,start在16000到30000之间的geneID,可以用beween
foverlaps 寻找重叠的区域,返回index对,x是数据很大但都是小区域的data.table,用来检索,y是检索用的资料,数据较小,都是大区域。
foverlaps(x, y, by.x = if (!is.null(key(x))) key(x) else key(y), x,y data.table,y需要设置key,x并不需要设置key; by.x,by.y 用来计算重叠的列名或者列号的矢量,by.x和by.y的最后两列都应该对应各自的(x,y的)start和end区间列,并且start列应该总是小于end列,如果x设置了key ,by.x相当于key(x),否则by.x就默认key(y)。by.y默认key(y); maxgap 设定两个区域空白区允许的最大值,参数尚不能使用; minoverlap 设定两个区域最小的重叠区,参数尚不能使用; type 设置重叠类型。默认any。可以设置为any,within,start,end和equal。equal尚不能使用。假设x,y区间分别为[ a,b ]和[ c,d ] , start 要求a==c , end要求b==d , within要求 a>=c 并且b <= d , equal要求a==c,b==d, 如果是any的话,只要c<=b 并且d>=a 就可以了; mult 当y里面的多行都匹配x里面的行,mult=控制返回,默认all,也可以设置为"first”和last; nomatch 默认nomatch=NA,无匹配返回NA,也可以设置为0,0不返回该行; which 默认FALSE结果返回x和y行的联合,当是TRUE时,如果mult=“all”,返回两列,一列x列号,一列相对应的y,如果nomatch=NA,不匹配的返回y的NA,如果nomatch=0,则跳过该列,设置mult="first“,mult=”last"则最后返回x一样的行数; verbose 当时TRUE的时候,工作台交互
chmatch 返回各字符串在第二个对象的首匹配位置,是match和%in%的加速版本。和fastmatch包的fmatch相比,各有优缺点。fmatch第一次匹配较慢,第二次匹配快,chmatch匹配虽然没有fmatch第二次匹配快,但是首次匹配也有较快的速度。 chmatch(x, table, nomatch=NA_integer_) table 字符矢量,匹配的目标; nomatch 不匹配时返回的值,强制转化整型
好了,写到这里写的都有点累了,再介绍最后一个函数,有时候我们需要了解你写的这个脚本运行所花费的时间,这个时候保存开始运行时间和结束运行时间,再进行相减之类的好像有点麻烦,其实我们可以用这个timetaken函数 timetaken timetaken(started.at) started.at proc.time( )的结果
最好,写完这篇博客,timetaken断断续续大约一星期
参考文献 data.table manual: https://cran.r-project.org/web/packages/data.table/data.table.pdf
|
请发表评论