R----data.table包介绍学习
相比dplyr包,data.table包能够更大程度地提高数据的处理速度,这里就简单介绍一下data.tale包的使用方法。
data.table:用于快速处理大数据集的哦
数据的读取
data.table包中数据读取的函数:fread()
data.table的创建
library(data.table)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
DT
    #    x y v
    # 1: a 1 1
    # 2: a 3 2
    # 3: a 6 3
    # 4: b 1 4
    # 5: b 3 5
    # 6: b 6 6
    # 7: c 1 7
    # 8: c 3 8
    # 9: c 6 9
基础操作
行提取
行提取分为单行提取和多行提取。
单行提取
DT[2]                      # 2nd row
    #    x y v
    # 1: a 3 2
DT[2,]                     # same
    #    x y v
    # 1: a 3 2
这里DT [2]和DT [2]是完全相同的,这里的「,」只是说明还有其他参数可设置,而其他参数按默认值进行计算。下文所有这样的最后一个「,」都不再写出来。
多行提取
- 数字提取
DT[1:2]
    #    x y v
    # 1: a 1 1
    # 2: a 3 2
DT[c(2,5)]
    #   x y v
    #1: a 3 2
    #2: b 3 5
- 逻辑提取
DT[c(FALSE,TRUE)]          # even rows (usual recycling)
    #    x y v
    # 1: a 3 2
    # 2: b 1 4
    # 3: b 6 6
    # 4: c 3 8
此时,C(FALSE,TRUE)会自己重复匹配成与DT的行数相同的向量
列提取
与行提取相同,列的提取也包含单列提取和多列提取。
单列提取
- 数字提取
数字提取时,一定要把问心无愧参数设置为FALSE。
DT[,2,with=FALSE]          # 2nd column
    #    y
    # 1: 1
    # 2: 3
    # 3: 6
    # 4: 1
    # 5: 3
    # 6: 6
    # 7: 1
    # 8: 3
    # 9: 6
- 列名提取
DT[,list(v)]               # v column (as data.table
    #    v
    # 1: 1
    # 2: 2
    # 3: 3
    # 4: 4
    # 5: 5
    # 6: 6
    # 7: 7
    # 8: 8
    # 9: 9
列名的修改
列名的修改可以使用setnames()函数,这个函数好像比对data.frame类型数据名更改的名称()和colnames()函数也要快一些。
dt = data.table(a=1:2,b=3:4,c=5:6) # compare to data.table
try(tracemem(dt))                  # by reference, no deep or shallow copies
setnames(dt,"b","B")               # by name, no match() needed (warning if "b" is missing)
setnames(dt,3,"C")                 # by position with warning if 3 > ncol(dt)
setnames(dt,2:3,c("D","E"))        # multiple
setnames(dt,c("a","E"),c("A","F")) # multiple by name (warning if either "a" or "E" is missing)
setnames(dt,c("X","Y","Z"))        # replace all (length of names must be == ncol(DT))
多列提取
- 数字提取
如同上面对按数字对单列的提取,对多列提取也要设置与参数为FALSE。
DT[,2:3,with=FALSE]
    #    y v
    # 1: 1 1
    # 2: 3 2
    # 3: 6 3
    # 4: 1 4
    # 5: 3 5
    # 6: 6 6
    # 7: 1 7
    # 8: 3 8
    # 9: 6 9
DT[,c(1,3),with=FALSE]
    #    x v
    # 1: a 1
    # 2: a 2
    # 3: a 3
    # 4: b 4
    # 5: b 5
    # 6: b 6
    # 7: c 7
    # 8: c 8
    # 9: c 9
- 按列名提取
DT[,list(y, v)]
    #    y v
    # 1: 1 1
    # 2: 3 2
    # 3: 6 3
    # 4: 1 4
    # 5: 3 5
    # 6: 6 6
    # 7: 1 7
    # 8: 3 8
    # 9: 6 9
如果按列名提取时,不使用列表,仍然能对列进行提取,只是结果以向量的形式输出。
DT[,v]                     # v column (as vector)
    # [1] 1 2 3 4 5 6 7 8 9
DT[,c(v)]                  # same
    # [1] 1 2 3 4 5 6 7 8 9
DT[, c(y, v)]
    # [1] 1 3 6 1 3 6 1 3 6 1 2 3 4 5 6 7 8 9
列的添加与删除
列的添加
- 单列添加
DT
    #    x y v
    # 1: a 1 1
    # 2: a 3 2
    # 3: a 6 3
    # 4: b 1 4
    # 5: b 3 5
    # 6: b 6 6
    # 7: c 1 7
    # 8: c 3 8
    # 9: c 6 9
DT[, a := 'k']
DT
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 3 5 k
    # 6: b 6 6 k
    # 7: c 1 7 k
    # 8: c 3 8 k
    # 9: c 6 9 k
DT[,c:=8]        # add a numeric column, 8 for all rows
DT
    #    x y v a c
    # 1: a 1 1 k 8
    # 2: a 3 2 k 8
    # 3: a 6 3 k 8
    # 4: b 1 4 k 8
    # 5: b 3 5 k 8
    # 6: b 6 6 k 8
    # 7: c 1 7 k 8
    # 8: c 3 8 k 8
    # 9: c 6 9 k 8
DT[,d:=9L]       # add an integer column, 9L for all rows
DT[2,d:=10L]     # subassign by reference to column d
DT
    #    x y v a c  d
    # 1: a 1 1 k 8  9
    # 2: a 3 2 k 8 10
    # 3: a 6 3 k 8  9
    # 4: b 1 4 k 8  9
    # 5: b 3 5 k 8  9
    # 6: b 6 6 k 8  9
    # 7: c 1 7 k 8  9
    # 8: c 3 8 k 8  9
    # 9: c 6 9 k 8  9
DT[, e := d + 2]
DT
    #    x y v a c  d  e
    # 1: a 1 1 k 8  9 11
    # 2: a 3 2 k 8 10 12
    # 3: a 6 3 k 8  9 11
    # 4: b 1 4 k 8  9 11
    # 5: b 3 5 k 8  9 11
    # 6: b 6 6 k 8  9 11
    # 7: c 1 7 k 8  9 11
    # 8: c 3 8 k 8  9 11
    # 9: c 6 9 k 8  9 11
如果添加的列名,数据中已经包含则是对这一列数据的修改。
- 多列的添加
DT[, c('f', 'g') := list( d + 1, c)]
DT[, ':='( f =  d + 1, g = c)]          # same
DT
    #    x y v a c  d  e  f g
    # 1: a 1 1 k 8  9 11 10 8
    # 2: a 3 2 k 8 10 12 11 8
    # 3: a 6 3 k 8  9 11 10 8
    # 4: b 1 4 k 8  9 11 10 8
    # 5: b 3 5 k 8  9 11 10 8
    # 6: b 6 6 k 8  9 11 10 8
    # 7: c 1 7 k 8  9 11 10 8
    # 8: c 3 8 k 8  9 11 10 8
    # 9: c 6 9 k 8  9 11 10 8
此处,需要注意的是新创建的列只能依照原有数据列,而不能依照新创建的列。例如这个例子中,G = C是可以运行,而摹= F则会提示错误。
列的删除
DT[,c:=NULL]     # remove column c
DT
    #    x y v a  d  e  f g
    # 1: a 1 1 k  9 11 10 8
    # 2: a 3 2 k 10 12 11 8
    # 3: a 6 3 k  9 11 10 8
    # 4: b 1 4 k  9 11 10 8
    # 5: b 3 5 k  9 11 10 8
    # 6: b 6 6 k  9 11 10 8
    # 7: c 1 7 k  9 11 10 8
    # 8: c 3 8 k  9 11 10 8
    # 9: c 6 9 k  9 11 10 8
DT[, c('d', 'e', 'f', 'g'):=NULL]
DT
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 3 5 k
    # 6: b 6 6 k
    # 7: c 1 7 k
    # 8: c 3 8 k
    # 9: c 6 9 k
列指标的简单操作
简单操作主要包括求和,平均值,方差和标准差等。
DT[2:3,sum(v)]             # sum(v) over rows 2 and 3
# [1] 5
DT[2:3,mean(v)]             # sum(v) over rows 2 and 3
# [1] 2.5
索引键
查看和创建索引
索引是对列而言的,索引创建后,数据将自动按索引值进行重新排序,所以每个数据最多只能有一个索引,但是索引可以由多列组成,这些列可以是数字,因子,字符串或其他格式。
单列索引的创建
## methdod first
key(DT)                    # key
    # NULL
setkey(DT,x)               # set a 1-column key. No quotes, for convenience.
key(DT)
[1] "x"
DT
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 3 5 k
    # 6: b 6 6 k
    # 7: c 1 7 k
    # 8: c 3 8 k
    # 9: c 6 9 k
## method second
setkeyv(DT,"y")            # same (v in setkeyv stands for vector)
key(DT)
    # [1] "y"
一旦对数据进行新的索引,原有的索引将消失。
多列索引的创建
## methdod first                    # key
setkey(DT,x,v)               # set a 1-column key. No quotes, for convenience.
key(DT)
    # [1] "x" "v"
DT
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 3 5 k
    # 6: b 6 6 k
    # 7: c 1 7 k
    # 8: c 3 8 k
    # 9: c 6 9 k
## method second
setkeyv(DT,c("x", "y"))           # same (v in setkeyv stands for vector)
key(DT)
    # [1] "x" "v"
DT
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 3 5 k
    # 6: b 6 6 k
    # 7: c 1 7 k
    # 8: c 3 8 k
    # 9: c 6 9 k
通过索引进行数据的提取
按照索引对数据提取,可以加快提取数据的速度。
单索引
正向提取
setkey(DT, x)
DT["a"]                    # binary search (fast)
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[.(x=="a")]                 # same; i.e. binary search (fast)
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[x=="a"]                 # same; i.e. binary search (fast)
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
- 反向提取
DT[!.("a")]                # not join
    #    x y v a
    # 1: b 1 4 k
    # 2: b 3 5 k
    # 3: b 6 6 k
    # 4: c 1 7 k
    # 5: c 3 8 k
    # 6: c 6 9 k
DT[!"a"]                   # same
    #    x y v a
    # 1: b 1 4 k
    # 2: b 3 5 k
    # 3: b 6 6 k
    # 4: c 1 7 k
    # 5: c 3 8 k
    # 6: c 6 9 k
DT[!2:4]                   # all rows other than 2:4
    #    x y v a
    # 1: a 1 1 k
    # 2: b 3 5 k
    # 3: b 6 6 k
    # 4: c 1 7 k
    # 5: c 3 8 k
    # 6: c 6 9 k
多索引
- 正向提取
setkey(DT, x, y)
# Mehtod First
DT["a"]                    # join to 1st column of key
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[.("a")]                 # same, .() is an alias for list()
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[.("a",3)]               # join to 2 columns
    #    x y v a
    # 1: a 3 2 k
DT[.("a",3:6)]             # join 4 rows (2 missing)
    #    x y  v  a
    # 1: a 3  2  k
    # 2: a 4 NA NA
    # 3: a 5 NA NA
    # 4: a 6  3  k
DT[.("a",3:6),nomatch=0]   # remove missing
    #    x y v a
    # 1: a 3 2 k
    # 2: a 6 3 k
DT[.("a",3:6),roll=TRUE]   # rolling join (locf)
    #    x y v a
    # 1: a 3 2 k
    # 2: a 4 2 k
    # 3: a 5 2 k
    # 4: a 6 3 k
## Method Second
DT[J('a')]
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[J("a",3)]               # binary search (fast)
    #    x y v a
    # 1: a 3 2 k
DT[J("a",3:6)]              # same; i.e. binary search (fast)
    #    x y  v  a
    # 1: a 3  2  k
    # 2: a 4 NA NA
    # 3: a 5 NA NA
    # 4: a 6  3  k
DT[J("a",3:6), nomatch = 0]
    #    x y v a
    # 1: a 3 2 k
    # 2: a 6 3 k
DT[J("a",3:6), roll = T]
    #    x y v a
    # 1: a 3 2 k
    # 2: a 4 2 k
    # 3: a 5 2 k
    # 4: a 6 3 k
## Method Third
DT[list("a")]
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
DT[list("a",3)]
    #    x y v a
    # 1: a 3 2 k
DT[list("a", 3:6)]
    #    x y  v  a
    # 1: a 3  2  k
    # 2: a 4 NA NA
    # 3: a 5 NA NA
    # 4: a 6  3  k
DT[list("a", 3:6), nomatch = 0]
    #    x y v a
    # 1: a 3 2 k
    # 2: a 6 3 k
DT[list("a", 3:6), roll = T]
    #    x y v a
    # 1: a 3 2 k
    # 2: a 4 2 k
    # 3: a 5 2 k
    # 4: a 6 3 k
- 反向提取
DT[x!="b" | y!=3]          # not yet optimized, currently vector scans
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 6 6 k
    # 6: c 1 7 k
    # 7: c 3 8 k
    # 8: c 6 9 k
DT[!.("b",3)]              # same result but much faster
    #    x y v a
    # 1: a 1 1 k
    # 2: a 3 2 k
    # 3: a 6 3 k
    # 4: b 1 4 k
    # 5: b 6 6 k
    # 6: c 1 7 k
    # 7: c 3 8 k
    # 8: c 6 9 k
分类汇总
分类汇总是指按某列的分类指标进行简单操作,借助由参数实现。此外,通过参数与索引相互没有影响这里。
单指标的分类汇总
- 默认汇总名称
DT[,sum(v),by=x]
    #    x V1
    # 1: a  6
    # 2: b 15
    # 3: c 24
DT[,sum(v),by=y]
    #    y V1
    # 1: 1 12
    # 2: 3 15
    # 3: 6 18
- 自定义汇总名称
DT[,list(sum.v.x = sum(v)),by=x]
    #    x sum.v.x
    # 1: a       6
    # 2: b      15
    # 3: c      24
DT[,list(sum.v.y = sum(v)),by=y]
    #    y sum.v.y
    # 1: 1      12
    # 2: 3      15
    # 3: 6      18
DT[,sum.v.y := sum(v) ,by=y]
    #    x y v a sum.v.y
    # 1: a 1 1 k      12
    # 2: a 3 2 k      15
    # 3: a 6 3 k      18
    # 4: b 1 4 k      12
    # 5: b 3 5 k      15
    # 6: b 6 6 k      18
    # 7: c 1 7 k      12
    # 8: c 3 8 k      15
    # 9: c 6 9 k      18
- 汇总结果与原始数据进行匹配
DT[,sum.v.y := sum(v) ,by=y]
    #    x y v a sum.v.y
    # 1: a 1 1 k      12
    # 2: a 3 2 k      15
    # 3: a 6 3 k      18
    # 4: b 1 4 k      12
    # 5: b 3 5 k      15
    # 6: b 6 6 k      18
    # 7: c 1 7 k      12
    # 8: c 3 8 k      15
    # 9: c 6 9 k      18
多指标的多个分类汇总
- 默认汇总名称
DT[,list(mean(v),sum(v)),by=list(x,y)]   # keyed by
    #    x y V1 V2
    # 1: a 1  1  1
    # 2: a 3  2  2
    # 3: a 6  3  3
    # 4: b 1  4  4
    # 5: b 3  5  5
    # 6: b 6  6  6
    # 7: c 1  7  7
    # 8: c 3  8  8
    # 9: c 6  9  9
- 自定义汇总名称
DT[,list(mean.v = mean(v),sum.v = sum(v)),by=list(x,y)]   # keyed by
    #   x y mean.v sum.v
    #1: a 1      1     1
    #2: a 3      2     2
    #3: a 6      3     3
    #4: b 1      4     4
    #5: b 3      5     5
    #6: b 6      6     6
    #7: c 1      7     7
    #8: c 3      8     8
    #9: c 6      9     9
- 汇总结果与原始数据进行匹配
DT[,c("mean.v", "sum.v.y") := list(mean(v),sum(v)) ,by=list(x,y)]
    #    x y v a sum.v.y mean.v
    # 1: a 1 1 k       1      1
    # 2: a 3 2 k       2      2
    # 3: a 6 3 k       3      3
    # 4: b 1 4 k       4      4
    # 5: b 3 5 k       5      5
    # 6: b 6 6 k       6      6
    # 7: c 1 7 k       7      7
    # 8: c 3 8 k       8      8
    # 9: c 6 9 k       9      9
data.table与data.frame的转化
data.table格式加快了处理速度,而data.frame则更为基础。两者的转化可以通过data.table(),setDT()和setDT()来实现,其中data.table()和setDT()函数可以将数据从data.frame转化为data.table,setDF()函数可以将数据从data.table转化为data.frame。注意使用data.table(),setDT()和setDT()时,参数本身的数据类型也会发生变化。
class(DT)
    # [1] "data.table" "data.frame"
class(setDF(DT))
    # [1] "data.frame"
class(DT)
    # [1] "data.frame"
此外,data.table包还可以与基础包中的重复的(),唯一的(),子()函数结合使用。不仅如此,data.table包还有一些基础包的替代函数.rbind()升级版的rbindlist(),可以合并列数不同和列位置不同的数据。比dplyr包中安排()函数更快的setorder()排序函数。
来源于:http://xukuang.github.io/blog/2016/04/data-table-in-R/
R----data.table包介绍学习的更多相关文章
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
		R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ... 
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
		每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ... 
- 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 包操作数据
		在第一节中,我们回顾了许多用于操作数据框的内置函数.然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便.然而,两种方法都有各自的局限性.使用内置函数可能既繁琐又缓慢,而相对于各式各 ... 
- 将基因组数据分类并写出文件,python,awk,R data.table速度PK
		由于基因组数据过大,想进一步用R语言处理担心系统内存不够,因此想着将文件按染色体拆分,发现python,awk,R 语言都能够非常简单快捷的实现,那么速度是否有差距呢,因此在跑几个50G的大文件之前, ... 
- data.table包简介
		data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ... 
- R读取大数据data.table包之fread
		>library(data.table)>data=fread("10000000.txt")>Read 9999999 rows and 71 (of 71) ... 
- R----dplyr包介绍学习
		dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ... 
随机推荐
- springMVC搭建
			springMVC搭建 1.Spring特点: 方便耦合,简化开发,提升性能 AOP面向切面的编程 声明式事务支持 方便程序的调试 方便集成各大优秀的框架 Java源代码学习的典范 2.Java的面向 ... 
- jenkins使用deploy-plugin自动构建部署war包
			jenkins+ant+maven+tomcat 1安装 jenkins 使用yum安装的 # 下载库 wget -O /etc/yum.repos.d/jenkins.repo http://pkg ... 
- 20145337《JAVA程序设计》第一周学习总结
			# 20145337 <Java程序设计>第1周学习总结 ## 教材学习内容总结 第一章 -Java最早是Sun公司撰写Star7应用程序的程序语言 -根据应用领域不同,有Java SE. ... 
- BizTalk开发系列(四) 深入Map测试
			在BizTalk的开发过程中XML消息间的映射是一个很重要的内容.如果只是一般的从源节点的值复制到目标节点的话,BizTalk项目提供的 MAP测试和验证就已经可以满足需求了.但是很多时候需要在映射的 ... 
- IOS第12天(3,UIViewController的生命周期)
			#import "HMViewController.h" @interface HMViewController () @property(nonatomic,strong)NSA ... 
- Linux ACL管理详解
			转自: http://linuxguest.blog.51cto.com/195664/124107 1. 为什么要使用ACL先让我们来简单地复习一下Linux的file permission.在li ... 
- mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017
			错误信息: listen(): bind() failed errno:48 Address already in use for socket: 0.0.0.0:27017 27017端口已经被占用 ... 
- php吧字符串直接转换成数组处理
			$str ='123456'; echo strlen($str) - 1; echo '<br>'; echo $str{strlen($str) - 1}; echo '<br& ... 
- java 截取pdf
			最近在读一本电子书,pdf中频繁引用后文的内容(页码),必须实时的跳过去看,但是扫描版的pdf的页码往往从封面就开始计数,而且盗版还经常有一些做广告的页面,这就导致pdf reader 索引的页面并不 ... 
- TCP三次握手四次挥手详解
			转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ... 
