r data.table包
对于某些data.table用户,“ dot-SD”有点神秘。 但是data.table的创建者Matt Dowle告诉我,它实际上非常简单:只需将其视为代表“每个组”的符号即可。 让我们来看几个例子。
我有一个来自波士顿地区自行车共享系统的每日自行车旅行数据集。 如果您想继续,可以从本文底部的链接下载CSV文件。
我将加载data.table并使用data.table的fread()
函数导入CSV文件。 在下面的代码中,我将数据保存到名为mydt的数据表中。
library(data.table)
mydt <- fread("daily_cycling_trips_by_usertype.csv")
接下来,我建议使用head(mydt)
打印前六行,以查看数据的外观。 您会看到数据中包含日期,用户类型(订户或单程客户),行程数,年份和月份开始日期的列,以按月汇总。
Matt建议的第一个示例:打印按用户类型分组的数据表的前几行。 (我们正在过滤前12行,只是为了更容易看到输出)。
mydt[1:12, print(.SD), by = usertype]
print()
遍历每个组,并分别打印两次,每种用户类型一次。 但是,问题是我不知道哪个是客户用户组,哪个是订户用户组。 “ by”列没有打印出来。 幸运的是,Matt向我展示了一个小技巧。
如果您熟悉mydt[i, j, by]
data.table语法,则在数据表名称后的括号符号中包含三部分: i
, j
和by
。 i
是用于过滤行, j
是你想做的事,和by
是你想怎么组数据。
例如:
mydt[1:12, { print(.SD) }, by = usertype]
在上面的代码行中,我只是在j
部分周围加上了花括号。 这将使我在j
参数中添加多个R表达式。 现在,它仍然与以前相同:没有用户类型名称。
但是在下一行代码中,请看我添加的R语句(好吧,Matt告诉我添加): print(.BY)
。
mydt[1:12, { print(.BY); print(.SD) }, by = usertype]
.BY
是一个特殊的data.table符号,其中包含by
的值–我要对哪个或哪些列进行分组。
如果运行此代码,则将具有每个分组变量的名称以及打印输出。
这是一个非常基本的例子。 我猜测您可能想对.SD
做一些比打印更有趣的事情。 接下来,让我们看一下按组汇总数据,计算出今年每个月哪一天旅行次数最多。
这行代码包含所有内容:
mydt[Year == "2019", .SD[which.max(Trips)], by = MonthStarting]
括号过滤器中的i
第一个参数过滤年份为2019的任何行j
参数是.SD
的有趣部分。 可以将.SD
看作是指您的每组数据。 或者像马特说,“你这样做j
通过by
。 就像一个for
循环。”
如果要查看每个月和每个用户类型的最大值,该怎么办? 只需在by
(third)参数中添加另一列即可:
mydt[Year == "2019", .SD[which.max(Trips)],
by = .(MonthStarting, usertype)]
有多种方法可以表示按data.table中的多个列进行分组。 一种方法是在无引号的列名称前加上点号,如上所述。 另一种方法是使用list
而不是点,例如:
mydt[Year == "2019", .SD[which.max(Trips)],
by = list(MonthStarting, usertype)]
您还可以使用传统的基R向量,并在每个列名称前后加上引号。
mydt[Year == "2019", .SD[which.max(Trips)],
by = c("MonthStarting", "usertype")]
有关R的更多技巧,请访问InfoWorld上的“用R做更多”视频页面,或查看YouTube播放列表“用R做更多” 。
希望下次见!
翻译自: https://www.infoworld.com/article/3408908/how-to-use-sd-in-the-r-datatable-package.html
r data.table包