我追随过去同事的脚步,并且需要操纵他正在构建的一些数据。因此,我正在阅读并复制他的代码,以便我理解他的所作所为。
然而,我来到一个部分,我知道他想要完成什么,但我不理解他的索引。
我通常使用循环进行类似的工作,因此这是一种我不熟悉的编码方法。
以下是这些行:
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。
任何人都认为他们可以解释发生了什么?
答案 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字段以获得所需的结果。