R之data.table 介绍

首先介绍下data.table的语法,如下所示:

内置的 order() 函数 * 我们可以对一个字符型的列,使用减号“-”,来实现降序排列。

# select取子集方法之subset(x, subset, select) 
注:subset特指对列的选择,select特指对行的选择, with = FALSE 来引用列名

select列

* 既然列可以作为变量被引用,我们可以直接引用我们想选取的列。

* 既然我们想选取所有的行,则可毋需指定参数 i。

* 返回了所有行的 arr_delay 列。

特殊的语法

.SD: data.table提供一个特殊的语法,形式是 .SD。它是 Subset of Data 的缩写。

它自身就是一个data.table,包含通过by 分组后的每一组。 回忆一下,一个data.table本质上是一个list,它们的列包含的元素个数都相同(其实就是行数)。

说明:

* .SD 包含除了分组依据的那一列以外的所有列。
* 返回值依旧保持了原数据的顺序。首先打印出来的是 ID=“b” 的数据,然后是 ID=“a” 的,最后是  ID=“c” 的。

为了对复数的列进行计算,我们可以简单地使用函数 lapply()。

说明:

* .SD 分别包含了ID是 a、b、c的所有行,它们分别对应了各自的组。我们应用函数 lapply() 对每列计算平均值。
* 每一组返回包含三个平均数的list,这些构成了最终返回的data.table。
* 既然函数 lapply() 返回 list,我们就不需要在外面多加 .() 了。

-如何指定希望计算平均值的列

.SDcols
使用参数 .SDcols。它接受列名或者列索引。比如,.SDcols = c("arr_delay", "dep_delay")能确保.SD之包含 arr_delay 和 dep_delay 这两列。
和 with = FALSE 一样,我们也可以使用 - 或者 ! 来移除列。比如,我们指定 !(colA:colB) 或者 -(colA:colB)表示移除从 colA 到 colB 的所有列。

总结

data.table的语法形式是:

DT[i, j, by]

指定参数i:

* 类似于data.frame,我们可以subset行,除非不需要重复地使用 DT$,既然我们能将列当做变量来引用。
* 我们可以使用order()排序。为了得到更快速的效果,order()函数内部使用了data.table的快速排序。
我们可以通过参数i做更多的事,得到更快速的选取和连结。我们可以在教程“Keys and fast binary search based subsets”和“Joins and rolling joins”中学到这些。

指定参数j:

* 以data.table的形式选取列:DT[, .(colA, colB)]。
* 以data.frame的形式选取列:DT[, c("colA", "colB"), with=FALSE]。
* 按列进行计算:DT[, .(sum(colA), mean(colB))]。
* 如果需要:DT[, .(sA =sum(colA), mB = mean(colB))]。
* 和i共同使用:DT[colA > value, sum(colB)]。

指定参数by:

* 通过by,我们可以指定列,或者列名,甚至表达式,进行分组。参数j可以很灵活地配置参数i和by实现强大的功能。
* by可以指定多个列,也可以指定表达式。
* 我们可以用 keyby,对分组的结果自动排序。
* 我们可以在参数j中指定 .SD 和 .SDcols,对复数的列进行操作。例如:
  1.把函数fun 应用到所有 .SDcols指定的列上,同时对参数by指定的列进行分组:DT[, lapply(.SD, fun), by=., .SDcols=...]。
  2.返回每组册前两行:DT[, head(.SD, 2), by=.]。
  3.三个参数联合使用:DT[col > val, head(.SD, 1), by=.]

小提示:
只要j返回一个list,这个list的每个元素都会是结果data.table的一列。

时间: 2024-10-23 15:58:37

R之data.table 介绍的相关文章

R之data.table速查手册

R语言data.table速查手册 介绍 R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加.data.table已经在金融,基因工程学等领域大放光彩.他尤其适合那些需要处理大型数据集(比如 1GB 到100GB)需要在内存中处理数据的人.不过这个包的一些符号并不是很容易掌握,因为这些操作方式在R中比较少见.这也是这篇文章的目的,为了给大家提供一个速查的手册. data.table的通用格式: DT[i, j, by],对于数据集DT,

R之data.table -melt/dcast(数据合并和拆分)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #323333 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "

R语言基因组数据分析可能会用到的data.table函数整理

R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部处理的步骤进行了程序上的优化,使用多线程,甚至很多函数是使用C写的,大大加快数据运行速度.因此,在对大数据处理上,使用data.table无疑具有极高的效率.这里主要介绍在基因组数据分析中可能会用到的函数. fread 做基因组数据分析时,常常需要读入处理大文件,这个时候我们就可以舍弃read.ta

将基因组数据分类并写出文件,python,awk,R data.table速度PK

由于基因组数据过大,想进一步用R语言处理担心系统内存不够,因此想着将文件按染色体拆分,发现python,awk,R 语言都能够非常简单快捷的实现,那么速度是否有差距呢,因此在跑几个50G的大文件之前,先用了244MB的数据对各个脚本进行测试,并且将其速度进行对比. 首先是awk处理,awk进行的是逐行处理,具有自己的语法,具有很大的灵活性,一行代码解决,用时24S, 1 #!/usr/bin/sh 2 function main() 3 { 4 start_tm=date 5 start_h=`

R 语言中 data table 的相关,内存高效的 增量式 data frame

面对的是这样一个问题,不断读入一行一行数据,append到data frame上,如果用dataframe,  rbind() ,可以发现数据大的时候效率明显变低. 原因是 每次bind 都是一次重新整个数据集的重新拷贝 这个链接有人测试了各种方案,似乎给出了最优方案 http://stackoverflow.com/questions/11486369/growing-a-data-frame-in-a-memory-efficient-manner library(data.table) d

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

> setwd("D:\\R_Tardy") > library(data.table) //  data.table 1.9.6   // For help type ?data.table or  // https://github.com/Rdatatable/data.table/wikiThe fastest way to learn (by data.table authors):  //  https://www.datacamp.com/courses/da

两种Data Table参数化设置的区别

首先介绍Data Table的语法: 1.DataTable.value(ParameterID, SheetID) 2.DataTable(ParameterID, SheetID) 以上2种方法的效果是一样的. 使用例子: WebEdit("关键字输入框").Set DataTable.Value("列名",“表名”) 然后比较Global Sheet和Local Sheet 1.Global Sheet:是一个全局变量,有几行数据,程序就要回放几次. 它受Da

RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

RapeLay(电车之狼R)的结局介绍 (隐藏结局) 必备知识要让MM怀孕非常easy.起初刚进入调教模式后.仅仅要H一次 MM就開始有时期状态. 生理(连上有红晕) ->不详状态(闭目第一次)->危急状态(闭目第二 次) 仅仅要在危急状态下和MM H 时 性->内 MM 開始受精 受精状态下 头像仅仅显示肚子  怀孕状态下 也仅仅显示肚子(大了点..) 提示: 受精怀孕过程须要非常长的周期,怎么消磨时间? 最快方法就是直接选 车站场景模式->车站->随便哪位->PLA

自定义data table 的列类型,并填充数据

combobox 的 datasource 一般是查询存储过程得到 , 但在测试或演示时,也可以自己定义 , 方法是 : DataTable customerTable = new DataTable(); customerTable.Columns.Add("clsCustomerID", typeof(string)); //定义列类型 customerTable.Columns.Add("clsCustomerNM", typeof(string)); Dat