data.table没有行名称。
b)?一样平常情势
为了让各人快速领略data.table语法的一样平常情势,先看看如下声名:
DT[i,0);">j,0);">by] ## ? R: ? i ? ? ?j ? ? ? ? ?by ## SQL: where select|update group by
看看上述描写,假如你相识sql说话,也许你就能很快大白data.table的语法。对付一个数据集DT ,用i 对数据的行数举办筛选,用j 对数据的罗列办筛选以及计较,用by 来指定命据怎样举办分组。接下来我们就来看看怎样操作i 和j 对数据举办处理赏罚。
c) 用i 筛选行数
# 筛选出得分大于40而且助攻数大于7次的数据 ans pts > 40 & ast >= 8]headans# ? ?rk player wl ? ? ? ? ? match gs min ? fgp fgm fga ? ?p3p p3m p3a ? ?ftp# 1: 25 ? 库里 胜 把戏114-130勇士 ?1 ?34 74.1% ?20 ?27 ?66.7% ?10 ?15 100.0%# 2: 63 ? 库里 胜 太阳116-135勇士 ?1 ?31 55.0% ?11 ?20 ?56.2% ? 9 ?16 ?90.9%# 3: 77 ? 库里 胜 鹈鹕120-134勇士 ?1 ?36 63.0% ?17 ?27 ?57.1% ? 8 ?14 100.0%# 4: 31 ? 沃尔 负 勇士134-121奇才 ?1 ?35 68.0% ?17 ?25 100.0% ? 3 ? 3 ?66.7%# 5: 23 ? 威少 负 鹈鹕123-119雷霆 ?1 ?38 60.0% ?15 ?25 ?60.0% ? 3 ? 5 ?78.6%# 6: 69 ? 威少 胜 鹈鹕103-110雷霆 ?1 ?36 56.0% ?14 ?25 ? 0.0% ? 0 ? 3 ?75.0%# ? ?ftm fta reb oreb dreb ast stl blk tov pf pts # 1: ? 1 ? 1 ? 7 ? ?0 ? ?7 ? 8 ? 0 ? 1 ? 5 ?1 ?51 # 2: ?10 ?11 ? 6 ? ?1 ? ?5 ? 8 ? 2 ? 0 ? 6 ?2 ?41 # 3: ?11 ?11 ? 4 ? ?0 ? ?4 ? 9 ? 4 ? 0 ? 2 ?3 ?53 # 4: ? 4 ? 6 ? 3 ? ?1 ? ?2 ?10 ? 2 ? 0 ? 3 ?4 ?41 # 5: ?11 ?14 ? 4 ? ?2 ? ?2 ? 9 ? 0 ? 0 ? 2 ?3 ?44 # 6: ?15 ?20 ? 9 ? ?3 ? ?6 ? 8 ? 1 ? 1 ? 4 ?1 ?43
– 提取pgdat 的前两行数据
[2ans # ? ?rk player wl ? ? ? ? ? match gs min ? fgp fgm fga ? p3p p3m p3a ? ?ftp # 1: ?1 ? 库里 胜 灰熊104-125勇士 ?1 ?30 62.5% ?15 ?24 52.6% ?10 ?19 100.0% # 2: ?2 ? 库里 胜 ? 马刺86-92勇士 ?1 ?35 59.1% ?13 ?22 44.4% ? 4 ? 9 100.0% # 1: ? 6 ? 6 ? 4 ? ?1 ? ?3 ? 6 ? 2 ? 0 ? 2 ?2 ?46 # 2: ? 7 ? 7 ? 5 ? ?0 ? ?5 ? 5 ? 2 ? 0 ? 4 ?4 ?37
– 排序
我们可以直接用R里自带的函数order 来完成排序。
# 把数据起首按得分降序分列,然后再按助攻数升序分列 order(-pts,0);">ast)# ? ?rk player wl ? ? ? ? ? ? match gs min ? fgp fgm fga ? p3p p3m p3a# 1: 77 ? 库里 胜 ? 鹈鹕120-134勇士 ?1 ?36 63.0% ?17 ?27 57.1% ? 8 ?14 # 2: 33 ? 库里 胜 ? 奇才121-134勇士 ?1 ?36 67.9% ?19 ?28 73.3% ?11 ?15 # 3: 25 ? 库里 胜 ? 把戏114-130勇士 ?1 ?34 74.1% ?20 ?27 66.7% ?10 ?15 # 4: 79 ? 威少 胜 ? 把戏136-139雷霆 ?1 ?48 47.2% ?17 ?36 20.0% ? 1 ? 5 # 5: 70 ? 库里 胜 丛林狼116-129勇士 ?1 ?38 60.0% ?15 ?25 61.5% ? 8 ?13 # 6: ?1 ? 库里 胜 ? 灰熊104-125勇士 ?1 ?30 62.5% ?15 ?24 52.6% ?10 ?19 # ? ? ? ftp ftm fta reb oreb dreb ast stl blk tov pf pts # 1: 100.0% ?11 ?11 ? 4 ? ?0 ? ?4 ? 9 ? 4 ? 0 ? 2 ?3 ?53 # 2: ?66.7% ? 2 ? 3 ? 7 ? ?1 ? ?6 ? 2 ? 3 ? 0 ? 7 ?3 ?51 # 3: 100.0% ? 1 ? 1 ? 7 ? ?0 ? ?7 ? 8 ? 0 ? 1 ? 5 ?1 ?51 # 4: ?81.3% ?13 ?16 ?11 ? ?5 ? ?6 ? 8 ? 1 ? 1 ? 6 ?3 ?48 # 5: 100.0% ? 8 ? 8 ? 5 ? ?0 ? ?5 ? 4 ? 2 ? 0 ? 3 ?3 ?46 # 6: 100.0% ? 6 ? 6 ? 4 ? ?1 ? ?3 ? 6 ? 2 ? 0 ? 2 ?2 ?46
在行使order 举办排序时,默认是升序分列,假如必要降序分列,可以在列名前加上- 。 值得一提的是,在data.table内里用到的order现实上颠末内部优化过了,它比R自带的order 现实上要快不少,看如下例子:
# Win7 32 # R 3.2.1 odt col=sample(1e7## uses order from base R t1 system.timeans1 odtbase::col]) ? # ? ?user ?system elapsed # ? 10.07 ? ?0.04 ? 10.15 ## uses data.table's forder t2 ans2 ) ? ? ? ? # ? ?0.63 ? ?0.06 ? ?0.69 identicalans1,0);">ans2# [1] TRUE
上述测试在win7的32位体系下举办,内存巨细为4GB,R回收的3.2.1版本,我们可以看到加快了~15倍。
d) 用j 选择列
– 选择pts 列,返回向量
[,0);">pts] # [1] 46 37 17 27 21 39
– 选择data.table
list# ? ?pts # 1: ?46 # 2: ?37 # 3: ?17 # 4: ?27 # 5: ?21 # 6: ?39
– 选择pts 和ast 两列数据
– 选择ast 两列数据而且将它们重定名为points 和assists
points assists # ? ?points assists # 1: ? ? 46 ? ? ? 6 # 2: ? ? 37 ? ? ? 5 # 3: ? ? 17 ? ? ? 8 # 4: ? ? 27 ? ? ? 9 # 5: ? ? 21 ? ? ?15 # 6: ? ? 39 ? ? ? 7
e) 用j 来计较
– 计较直接得分和间接得分之和
# 间接得分简朴记为助攻数*2 player,0);">tpts + 2*# ? ? ?player tpts # ? 1: ? 库里 ? 58 # ? 2: ? 库里 ? 47 # ? 3: ? 库里 ? 33 # ? 4: ? 库里 ? 45 # ? 5: ? 库里 ? 51 # ?--- ? ? ? ? ? ? # 415: ? 欧文 ? 23 # 416: ? 欧文 ? 26 # 417: ? 欧文 ? 17 # 418: ? 欧文 ? 13 # 419: ? 欧文 ? 20
f) 用i 筛选数据而且用j 做一些计较
– 计较库里的场均得分和助攻数
player == "库里",? ? ? ? ? ? ? .m_ptsmeanm_ast# ? ? ? m_pts ? ?m_ast # 1: 30.06329 6.670886
– 计较得分大于便是20分而且助攻数大于便是10个的两双的总场次
20 10,0);">length# [1] 87
length 用来计较数据的长度,这里的列名现实上选取恣意一列都可以,data.table提供了一个沟通成果的函数.N 来实现,用来暗示数据的行数。于是上述代码可以有以劣等价表述方法:
.N# [1] 87
g) 用j 通过字符串的变量名来选择数据列
行使参数with = FALSE
– 跟data.frame沟通的方法选择"pts",68);">"ast"with=FALSE# 6: ?39 ? 7
2. 数据整合
先容完了i 和j 的用法,接下来先容怎样用by 来实现分组数据计较。
a) 用by 分组
– 计较差异球员的参赛场次
by=.player# ? ?player ?N # 1: ? 库里 79 # 2: ? 康利 56 # 3: ? 保罗 74 # 4: ? 沃尔 77 # 5: ? 威少 80 # 6: ? 欧文 53 ## 回收字符串情势 # ans <- pgdat[,.(.N),by="player"]
– 计较差异球员助攻大于便是8次的参赛场次
8,0);">.N,136); font-style: italic;"># 1: ? 库里 30 # 2: ? 康利 17 # 3: ? 保罗 54 # 4: ? 沃尔 62 # 5: ? 威少 61 # 6: ? 欧文 ?8
– 计较差异球员在差异胜败相关下助攻大于便是8次的参赛场次
wl# ? ? player wl ?N # ?1: ? 库里 胜 28 # ?2: ? 库里 负 ?2 # ?3: ? 康利 胜 14 # ?4: ? 康利 负 ?3 # ?5: ? 保罗 胜 34 # ?6: ? 保罗 负 20 # ?7: ? 沃尔 负 29 # ?8: ? 沃尔 胜 33 # ?9: ? 威少 胜 44 # 10: ? 威少 负 17 # 11: ? 欧文 负 ?2 # 12: ? 欧文 胜 ?6
– 计较差异球员在差异胜败相关了局均得分与助攻数
## j配置参数名 # ? ? player wl ? ? ? V1 ? ? ? ?V2 # ?1: ? 库里 胜 30.39437 ?6.647887 # ?2: ? 库里 负 27.12500 ?6.875000 # ?3: ? 康利 负 13.95652 ?5.000000 # ?4: ? 康利 胜 16.24242 ?6.878788 # ?5: ? 保罗 胜 18.98000 10.240000 # ?6: ? 保罗 负 20.70833 ?9.416667 # ?7: ? 沃尔 负 18.80000 ?9.400000 # ?8: ? 沃尔 胜 21.05405 11.162162 # ?9: ? 威少 胜 22.30909 10.563636 # 10: ? 威少 负 26.04000 10.120000 # 11: ? 欧文 胜 20.08108 ?4.783784 # 12: ? 欧文 负 18.62500 ?4.562500 ## j不配置参数名 mpts mast ? ? ? ? ? ? ?# ? ? player wl ? ? mpts ? ? ?mast # 12: ? 欧文 负 18.62500 ?4.562500
|