本文概述
本data.table R教程介绍了DT [i, j, by]命令的基础, 该命令是data.table包的核心。如果你想了解更多有关data.table包的信息, srcmini会提供有关data.table包的交互式R课程。该课程包含超过35个交互式R练习-全部在你自己的浏览器中进行-以及与data.table包的主要作者Matt Dowle和主要贡献者Arun Srinivasan在一起的一些视频。免费试用。
如果你已经使用过RAM中的大型数据集(1到100GB以上), 则知道data.frame可能会受到限制:执行某些操作所花费的时间太长。 Data.table通过减少计算时间为你解决了这一问题。不仅如此, 它还使键入更少的内容变得更容易。一旦你掌握了本data.table R教程中的data.table语法, 执行复杂操作的简单性将使你感到惊讶。因此, 你不仅会减少计算时间, 而且会减少编程时间。
DT [i, j, by]命令包含三个部分:i, j和by。如果以SQL术语考虑, 则i对应WHERE, j对应SELECT, by对应GROUP BY。我们通过说”获取DT, 使用’i’子集化行, 然后计算’j’并按’by’分组”来讨论命令。因此, 在一个简单的示例中, 并使用hflights数据集(以便你可以复制所有示例)可以得出:
library(hflights)
library(data.table)
DT <- as.data.table(hflights)
DT[Month==10, mean(na.omit(AirTime)), by=UniqueCarrier]
UniqueCarrier V1
AA 68.76471
AS 255.29032
B6 176.93548
CO 141.52861
...
我们对数据表进行了子集化, 仅保留一年中第10个月的行, 计算了实际飞行的飞机的平均AirTime(这就是使用na.omit()的原因, 已取消的航班没有它们的值AirTime), 然后按其运营商对结果进行分组。例如, 我们可以看到, AA(美国航空)的平均AirTime相比AS(阿拉斯加航空)的平均AirTime短。你是否还注意到R基本功能可以在j部分中使用?我们稍后再讲。
DT[i, j, by]的i
” i”部分用于对行进行子集设置, 就像在数据框中一样。
DT[2:5]
#selects the second to the fifth row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 1 2 7 1401 1501 AA 428 N557AA 60 45
2011 1 3 1 1352 1502 AA 428 N541AA 70 48
2011 1 4 2 1403 1513 AA 428 N403AA 70 39
2011 1 5 3 1405 1507 AA 428 N492AA 62 44
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-9 1 IAH DFW 224 6 9 0 0
-8 -8 IAH DFW 224 5 17 0 0
3 3 IAH DFW 224 9 22 0 0
-3 5 IAH DFW 224 9 9 0 0
但是, 你也可以使用列名, 因为它们是在DT范围内评估的。
DT[UniqueCarrier=="AA"]
#Returns all those rows where the Carrier is American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
2011 1 1 6 1400 1500 AA 428 N576AA 60
2011 1 2 7 1401 1501 AA 428 N557AA 60
2011 1 3 1 1352 1502 AA 428 N541AA 70
2011 1 4 2 1403 1513 AA 428 N403AA 70
2011 1 5 3 1405 1507 AA 428 N492AA 62
---
2011 12 27 2 1021 1333 AA 2234 N3ETAA 132
2011 12 28 3 1015 1329 AA 2234 N3FJAA 134
2011 12 29 4 1023 1335 AA 2234 N3GSAA 132
2011 12 30 5 1024 1334 AA 2234 N3BAAA 130
2011 12 31 6 1024 1343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40 -10 0 IAH DFW 224 7 13 0 0
45 -9 1 IAH DFW 224 6 9 0 0
48 -8 -8 IAH DFW 224 5 17 0 0
39 3 3 IAH DFW 224 9 22 0 0
44 -3 5 IAH DFW 224 9 9 0 0
---
112 -12 1 IAH MIA 964 8 12 0 0
112 -16 -5 IAH MIA 964 9 13 0 0
110 -10 3 IAH MIA 964 12 10 0 0
110 -11 4 IAH MIA 964 9 11 0 0
119 -2 4 IAH MIA 964 8 12 0 0
请注意, 你不必在数据表的子行中使用逗号。在data.frame中, 执行此DF [2:5]将给出第二至第五列的所有行。相反(众所周知, 每个人都知道), 我们必须指定DF [2:5, ]。还要注意, DT [, 2:5]对于数据表没有任何意义, 正如data.table包的常见问题中的第一个问题所述。
古怪且有用:在对行进行子集设置时, 还可以在DT […]命令中使用符号.N, 即行数或最后一行。你可以使用它来选择最后一行或相对于它的偏移量。
DT[.N-1]
#Returns the penultimate row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 12 6 2 656 812 WN 621 N727SW 76 64
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13 -4 HOU TUL 453 3 9 0 0
DT[i, j, by]的j部分
” j”部分用于选择列并对其进行填充。东西真的可以意味着任何东西。可以使用各种功能, 这是data.table包的重点。
DT[, mean(na.omit(ArrDelay))]
[1] 7.094334
请注意, ” i”部分留为空白, 括号中的第一件事是逗号。起初这似乎违反直觉。但是, 这仅表示我们不对任何行进行子集设置, 因此所有行均被选中。在” j”部分, 计算所有航班到达的平均延迟。看来, hflights数据集的平均平面有超过7分钟的延迟。下班时要做好准备!
选择几列并在” j”部分中进行处理时, 需要使用”。()”表示法。该符号实际上只是” list()”的别名。它返回一个数据表, 而不使用”。()”, 仅返回一个向量, 如上所示。
DT[, .(mean(na.omit(DepDelay)), mean(na.omit(ArrDelay)))]
V1 V2
9.444951 7.094334
另一个需要’。()’表示法的有用功能允许你重命名DT […]命令中的列。
DT[, .(Avg_ArrDelay =
mean(na.omit(ArrDelay)))]
Avg_ArrDelay
7.094334
DT[, .(Avg_DepDelay = mean(na.omit(DepDelay)), avg_ArrDelay = mean(na.omit(ArrDelay)))]
Avg_DepDelay Avg_ArrDelay
9.444951 7.094334
当然, 新列名称不是必须的。
将上述有关” i”和” j”的信息结合起来, 得出:
DT[UniqueCarrier=="AA", .(Avg_DepDelay =
mean(na.omit(DepDelay)), Avg_ArrDelay = mean(na.omit(ArrDelay)), plot(DepTime, DepDelay, ylim=c(-15, 200)), abline(h=0))]
Avg_DepDelay Avg_ArrDelay V3 V4
6.390144 0.8917558 NULL NULL
在这里, 我们进行了DT, 在” i”部分中选择了载波为AA的所有行, 计算了起飞和到达的平均延迟, 并在” j”部分中绘制了起飞时间与起飞延迟的关系。
回顾一下, ” j”部分用于对该部分中指定的列进行计算。由于数据表的列被视为变量, 而” j”的部分被视为表达式, 因此实际上, ” j”部分中可以做任何事情。这大大缩短了你的编程时间。
DT[i, j, by]的by部分
本data.table R教程的最后一部分重点介绍” by”部分。当我们要计算按特定变量(或对该变量的操作)分组的” j”部分时, 使用” by”部分。你会看到每个” by”组都重复了” j”表达式。它使用简单:只需在” by”参数中指定要分组的列。
DT[, mean(na.omit(DepDelay)), by=Origin]
Origin V1
IAH 8.436951
HOU 12.837873
在这里, 我们计算了出发前的平均延迟时间, 但按飞机的来源进行了分组。从HOU起飞的航班似乎比从IAH起飞的航班平均延误时间更长。
与” j”部分一样, 你可以在” by”部分中做很多事情。可以在” by”部分中使用函数, 以便在” j”部分中完成的操作结果按我们在DT […]命令中指定的内容进行分组。在DT […]内部使用函数使这一行非常强大。同样, 在” by”部分中使用几列时, 需要使用”。()”符号。
DT[, .(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin, Weekdays = DayOfWeek<6)]
Origin Weekdays Avg_DepDelay_byWeekdays
IAH FALSE 8.286543
IAH TRUE 8.492484
HOU FALSE 10.965384
HOU TRUE 13.433994
在这里, 首先计算所有飞机出发前的平均延迟(” i”部分中没有子集, 因此选择了所有行), 然后第二次分组, 首先按飞机原点, 然后按工作日分组。在周末, 工作日为假。看来, 飞机从后勤部队离开时, 起飞前的平均延误要比从国际航空联队起飞时大, 令人惊讶的是, 周末的延误要小得多。
将所有典型的DT [i, j, by]命令放在一起可以得到:
DT[UniqueCarrier=="DL", .(Avg_DepDelay =
mean(na.omit(DepDelay)), Avg_ArrDelay = mean(na.omit(ArrDelay)), Compensation = mean(na.omit(ArrDelay - DepDelay))), by = .(Origin, Weekdays = DayOfWeek&lt;6)]
Origin Weekdays Avg_DepDelay Avg_ArrDelay Compensation
IAH FALSE 8.979730 4.116751 -4.825719
HOU FALSE 7.120000 2.656566 -4.555556
IAH TRUE 9.270948 6.281941 -2.836609
HOU TRUE 11.631387 10.406593 -1.278388
在此, 由达美航空(在” i”中选择)飞行的飞机子集按其来源和工作日(在” by”中)分组。还计算了在空气中补偿的时间(以” j”表示)。似乎在周末, 无论飞机是来自IAH还是HOU, 在空中补偿的时间(因此通过更快的飞行)都更长。
在数据表包中还有很多发现的地方, 但是本文说明了基本的DT [i, j, by]命令。 srcmini课程广泛解释了整个数据表包。你可以在浏览器中按自己的节奏进行练习, 同时获取提示和反馈, 并根据需要查看视频和幻灯片。这种交互式的学习方式使你能够获得有关数据表的丰富知识和实践经验。免费试用。
希望你知道由于此data.table R教程而了解了data.table的基本语法, 并准备好进行实验。如果你对data.table包有疑问, 请在这里查看。马特和阿伦非常活跃。 data.table软件包中的下一篇博客文章将更具技术性, 着重介绍数据表的广泛可能性。敬请关注!
评论前必须登录!
注册