【问题标题】:Understanding data.table syntax了解 data.table 语法
【发布时间】:2016-01-25 21:07:26
【问题描述】:

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

但是,我遇到了一个部分,我知道他想要完成什么,但我不明白他的索引。

我通常用循环做类似的工作,所以这是一种我不熟悉的编码方法。

这是行:

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

所以“cummingsOUT”是一个相当大的纵向数据集,包含 300 万个 obs。 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,并将其设置为所有行的数据集。但是“。”是什么意思?做?有人可以解释 Weeks20 吗?他是否在索引中创建了一个新对象,即对个人的总观察值求和,直到与 WEEK 中的值 20 匹配的数据点?然后他又索引了?

我认为第三行只是匹配到第 20 周被确定为具有 18 个或更多 obs 的 ID。

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

【问题讨论】:

  • 请阅读this。这是一个非常基本的data.table 语法。
  • 以前从未使用过 data.table。感谢您提供的简单链接,它真的很有帮助。

标签: r data.table


【解决方案1】:

首先,按照@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

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

然后,原始编码器将数据子集化,由 Weeks20 > 18 的那些 - 让我们为 new 做同样的事情:

new[numofgoodcars > 4]

   cyl numofgoodcars
1:   4            11

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

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

【讨论】:

    【解决方案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 字段即可获得所需的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多