了解data.table语法

时间:2016-01-25 21:07:26

标签: r data.table

我追随过去同事的脚步,并且需要操纵他正在构建的一些数据。因此,我正在阅读并复制他的代码,以便我理解他的所作所为。

然而,我来到一个部分,我知道他想要完成什么,但我不理解他的索引。

我通常使用循环进行类似的工作,因此这是一种我不熟悉的编码方法。

以下是这些行:

IDs         <- unique(cummingsOUT$ID)
c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]
cummingsOUT <- cummingsOUT[cummingsOUT$ID %in% c2$ID ,]

所以&#34; cummingsOUT&#34;是一个相当大的纵向数据集,有300万个人。共有431,000个人的6个变量。 6个变量是ID(数值),GRADE(因子),SCORE(数值),WEEK(数值),MEASURE(因子),DATA(因子)。对于每个人,可以在同一周内有多个SCORE。

此时,该同事被指示仅保留其个人周20中有18个或更多SCORE的唯一ID。

我得到的第一行,虽然他最终没有使用IDS。这是第二个困扰我的人。

 c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]

这里发生了什么?他创建了一个对象c2,并将其设置为等于所有行的数据集。但是&#34;。&#34;是什么?做?有人可以解释Weeks20吗?他是否在索引中创建了一个新对象,它将个人的总观察值加起来,直到与WEEK中的值20匹配的数据点?然后他再次索引?

第三行我相信他只是匹配在第20周被识别为18或更多的ID。

任何人都认为他们可以解释发生了什么?

2 个答案:

答案 0 :(得分:3)

首先,阅读文档,正如@DavidArenburg建议的那样。

然后一步一步走。我们可以忽略你的第一行 - 它不在这里使用。

我将使用mtcars数据集,因为您没有提供可重现的数据

#load data.table
library(data.table)
#copy mtcars, as otherwise it's locked
mtcars <- copy(mtcars)
#turn it into a data.table
setDT(mtcars)
#make the new variable
new <- mtcars[,.(numofgoodcars = sum(mpg > 20)), by = cyl]

我们现在有新的,应该是这样的:

   cyl numofgoodcars
1:   6             3
2:   4            11
3:   8             0

这是一个摘要,每个numofgoodcars都有一个新列cyl,与Weeks20 ID完全相同。

然后,原始编码器通过Weeks20&gt;的那些对数据进行子集化。 18 - 让我们为new

做同样的事情
new[numofgoodcars > 4]

   cyl numofgoodcars
1:   4            11

原始编码员只需将这两个步骤放在一起:

mtcars[,.(numofgoodcars = sum(mpg > 20)), by = cyl][numofgoodcars > 4]

答案 1 :(得分:2)

c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]

打破这个:

cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID]

对于表cummingsOut,计算一个新表,每个ID一行,其中包含字段Weeks20,计算为WEEK小于21的周数。

[Weeks20 >= 18]

仅返回Weeks20大于18的行。

因此,假设原始数据每周包含一个分数,您可以:

为前20周内得分为18分或以上的每个用户ID返回一行。

by运算符将在每行中保留ID的副本,因此现在您只需要提取ID字段以获得所需的结果。