data.table R教程(DT[i, j, by]简介)

本文概述

  • DT[i, j, by]的i
  • DT[i, j, by]的j部分
本data.table R教程介绍了DT [i, j, by]命令的基础, 该命令是data.table包的核心。如果你想了解更多有关data.table包的信息, srcmini会提供有关data.table包的交互式R课程。该课程包含超过35个交互式R练习-全部在你自己的浏览器中进行-以及与data.table包的主要作者Matt Dowle和主要贡献者Arun Srinivasan在一起的一些视频。免费试用。
data.table R教程(DT[i, j, by]简介)

文章图片
如果你已经使用过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 & lt; - as.data.table(hflights) DT[Month==10, mean(na.omit(AirTime)), by=UniqueCarrier]

UniqueCarrier V1 AA68.76471 AS255.29032 B6176.93548 CO141.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 12714011501AA428N557AA6045 2011 13113521502AA428N541AA7048 2011 14214031513AA428N403AA7039 2011 15314051507AA428N492AA6244ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted -91IAHDFW2246900 -8-8IAHDFW22451700 33IAHDFW22492200 -35IAHDFW2249900

但是, 你也可以使用列名, 因为它们是在DT范围内评估的。
DT[UniqueCarrier==& quot; AA& quot; ]

#Returns all those rows where the Carrier is American Airlines Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime 2011 11614001500AA428N576AA60 2011 12714011501AA428N557AA60 2011 13113521502AA428N541AA70 2011 14214031513AA428N403AA70 2011 15314051507AA428N492AA62 --- 2011 1227210211333AA2234N3ETAA132 2011 1228310151329AA2234N3FJAA134 2011 1229410231335AA2234N3GSAA132 2011 1230510241334AA2234N3BAAA130 2011 1231610241343AA2234N3HNAA139 AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted 40-100IAHDFW22471300 45-91IAHDFW2246900 48-8-8IAHDFW22451700 3933IAHDFW22492200 44-35IAHDFW2249900 --- 112-121IAHMIA96481200 112-16-5IAHMIA96491300 110-103IAHMIA964121000 110-114IAHMIA96491100 119-24IAHMIA96481200

请注意, 你不必在数据表的子行中使用逗号。在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 1262656812WN621N727SW7664 ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted -13-4HOUTUL4533900

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)))]

V1V2 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.4449517.094334

当然, 新列名称不是必须的。
将上述有关” i” 和” j” 的信息结合起来, 得出:
DT[UniqueCarrier==& quot; AA& quot; , .(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 V3V4 6.3901440.8917558NULLNULL

data.table R教程(DT[i, j, by]简介)

文章图片
在这里, 我们进行了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]

OriginV1 IAH8.436951 HOU12.837873

在这里, 我们计算了出发前的平均延迟时间, 但按飞机的来源进行了分组。从HOU起飞的航班似乎比从IAH起飞的航班平均延误时间更长。
与” j” 部分一样, 你可以在” by” 部分中做很多事情。可以在” by” 部分中使用函数, 以便在” j” 部分中完成的操作结果按我们在DT […]命令中指定的内容进行分组。在DT […]内部使用函数使这一行非常强大。同样, 在” by” 部分中使用几列时, 需要使用” 。()” 符号。
DT[, .(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin, Weekdays = DayOfWeek& lt; 6)]

Origin Weekdays Avg_DepDelay_byWeekdays IAHFALSE8.286543 IAHTRUE8.492484 HOUFALSE10.965384 HOUTRUE13.433994

在这里, 首先计算所有飞机出发前的平均延迟(” i” 部分中没有子集, 因此选择了所有行), 然后第二次分组, 首先按飞机原点, 然后按工作日分组。在周末, 工作日为假。看来, 飞机从后勤部队离开时, 起飞前的平均延误要比从国际航空联队起飞时大, 令人惊讶的是, 周末的延误要小得多。
将所有典型的DT [i, j, by]命令放在一起可以得到:
DT[UniqueCarrier==& quot; DL& quot; , .(Avg_DepDelay = mean(na.omit(DepDelay)), Avg_ArrDelay = mean(na.omit(ArrDelay)), Compensation = mean(na.omit(ArrDelay - DepDelay))), by = .(Origin, Weekdays = DayOfWeek& amp; lt; 6)]

Origin Weekdays Avg_DepDelay Avg_ArrDelay Compensation IAHFALSE8.9797304.116751-4.825719 HOUFALSE7.1200002.656566-4.555556 IAHTRUE9.2709486.281941-2.836609 HOUTRUE11.63138710.406593-1.278388

在此, 由达美航空(在” i” 中选择)飞行的飞机子集按其来源和工作日(在” by” 中)分组。还计算了在空气中补偿的时间(以” j” 表示)。似乎在周末, 无论飞机是来自IAH还是HOU, 在空中补偿的时间(因此通过更快的飞行)都更长。
在数据表包中还有很多发现的地方, 但是本文说明了基本的DT [i, j, by]命令。 srcmini课程广泛解释了整个数据表包。你可以在浏览器中按自己的节奏进行练习, 同时获取提示和反馈, 并根据需要查看视频和幻灯片。这种交互式的学习方式使你能够获得有关数据表的丰富知识和实践经验。免费试用。
【data.table R教程(DT[i, j, by]简介)】希望你知道由于此data.table R教程而了解了data.table的基本语法, 并准备好进行实验。如果你对data.table包有疑问, 请在这里查看。马特和阿伦非常活跃。 data.table软件包中的下一篇博客文章将更具技术性, 着重介绍数据表的广泛可能性。敬请关注!

    推荐阅读