R 理解data.table语法

R 理解data.table语法,r,data.table,R,Data.table,我跟随一位过去同事的脚步,需要处理他正在构建的一些数据。因此,我正在通读并复制他的代码,以便理解他的所作所为 然而,我来到了一个章节,我知道他想要完成什么,但我不理解他的索引 我通常对循环做类似的工作,因此这是一种我不熟悉的编码方法 以下是台词: IDs <- unique(cummingsOUT$ID) c2 <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]

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

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

我通常对循环做类似的工作,因此这是一种我不熟悉的编码方法

以下是台词:

IDs         <- unique(cummingsOUT$ID)
c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]
cummingsOUT <- cummingsOUT[cummingsOUT$ID %in% c2$ID ,]
所以cummingsOUT是一个相当大的纵向数据集,包含300万个OB。431000人的6个变量。这6个变量是IDnumeric、GRADEfactor、scorenumeric、weeknumeric、MEASUREfactor、DATAfactor。对于每个人来说,可能在同一周内获得多个分数

在这一点上,同事被指示只保留在个人第20周得分为18分或以上的唯一ID

我得到的第一句话,虽然他最终没有使用ID。这是第二个让我难堪的问题

 c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]
这是怎么回事?他创建一个对象c2,并将其设置为所有行的数据集。但是,问题是什么呢。做有人能翻译20周吗?他是否在索引中创建了一个新的对象,将个人的总观察值相加,直至与每周20的值相匹配的数据点?然后他又来了

第三行我相信是他刚刚匹配的身份证被确定为有18个或更多的OB到第20周


有人认为他们能解释发生了什么吗?

首先,按照@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]
这是一个总结,每一个共青团都有一个新的专栏,numofgoodcars,正如ID在20周所做的一样

然后,最初的编码员将数据细分为那些周数20>18的数据-让我们对新的进行同样的处理:

最初的编码器只是将这两个步骤放在一起:

mtcars[,.(numofgoodcars = sum(mpg > 20)), by = cyl][numofgoodcars > 4]
仅返回Weeks20大于18的行

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

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


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

请阅读。这是一个非常基本的data.table语法。以前从未使用过data.table。谢谢你的简单链接,它真的很有帮助。
new[numofgoodcars > 4]

   cyl numofgoodcars
1:   4            11
mtcars[,.(numofgoodcars = sum(mpg > 20)), by = cyl][numofgoodcars > 4]
c2          <- cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID][Weeks20 >= 18]
cummingsOUT[, .(Weeks20 = sum(WEEK<21)),by=ID]
[Weeks20 >= 18]