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

fread中nThread 参数的使用

  注意默认nThread=getDTthreads(),即便用全部能用的核心,但并非核心用的越多越好,本人亲自测试的状况下,其实单核具备较强的性能,只有在数据大于3Gb的状况下,开启11核(个人机器所有核心30多核)效率才比一个核心更高,而默认使用所有的核心效率一直很是低。所以对于不是很是巨大的文件,建议设置为1,不要使用所有核心web

fread中sep是自动检测的

  因此在循环读入文件的过程当中,就算不一样文件的分隔符不一样,也能够循环一次性方便的读入; 还有就算后续改变了文件的分隔符,文件也能够读入,建议不加分隔符sql

fread能够自动检测注释,而且跳过注释行

  默认skip=0,会跳过不规则的行,所以有注释行时,能够走默认的skip参数app

转换成矩阵时能够保留某一列为rowname

  as.matrix做用于data.table时会调用as.matrix.data.table,有一个rownames参数能够指定保留为行名的列函数

矩阵转换成data.table时能够保留列名

  在as.data.table函数中一样有一个rownames参数,设置为T能够将行名保留下来做为data.table的一列性能

不建议set和for循环一块儿使用

  虽然set能够在内存上直接改变数值,但在R中用for循环比批量列运算慢的多,所以首选:=或者apply等测试

在处理浮点数时会有一些准确性的问题

  好比用seq函数numeric类型的数值时,会存在不许确的问题,好比seq(0,1,by=0.2)中的0.6就不等于0.6, 虽然很费解,但这是由于计算机在存储浮点数时出现的一些问题。如今只发现seq函数会出现这种状况,manual中提供了一个函数解决这个问题,setNumericRounding(2) ,去除最后两个字节,这样运行的更快,也不会出现0.6不等于0.6的问题ip

支持数据框取交集和并集

  相似于集合运算,data.table中fintersect, fsetdiff, funion,fsetequal函数能对不一样数据框的行求交集,差集,并集等内存

能够直接对列按分隔符进行分割

  应用tstrsplit函数能够将一列按照分隔符分红多列,函数返回的是一个列表,举例:DT[, c("c1", "c2") := tstrsplit(x, "/", fixed=TRUE)][],将x列按照/分隔,分割成c1,c2两列get

支持相似于SQLs的分组运算

  带有rollup, cube, groupingsets函数it

参考资料

data.table 1.11.2 manual:https://cran.r-project.org/web/packages/data.table/data.table.pdf

相关文章
相关标签/搜索