【问题标题】:Compare to next row, grouped, data.table比较下一行,分组,data.table
【发布时间】:2014-11-01 07:55:13
【问题描述】:

我有一个数据框,其中包含每个用户每周的页面浏览量。我想确定,对于每个用户,他们的浏览量在某个事件之后是增加、减少还是保持不变。我的数据如下所示:

Userid week xeventinweek numviews
Alice   1    2            5
Alice   2    0            3
Alice   4    1            6
Bob     2    2            3
Bob     3    0            5

因此,在这种情况下,爱丽丝在第 1 周有 2 场活动后,她的观看次数减少了,而她在第 2 周没有活动可以衡量。然而,鲍勃在举办两场比赛后的一周内将他的观看次数从 3 增加到 5。

我想要一张表格,其中包含每周至少有一个事件的观看次数差异。所以它应该看起来像这样:

Userid  week xeventinweek numviews numnextweek difference
Alice    1      2           5          3               -2
Alice    4      1           6          NA              NA #the row for week 2 is missing because there were no events then for Alice
Bob      2      2           3          5                2

不必同时拥有 numnextweek 列和差异列 - 要么 要么 可以。

我可以使用 data.table 和 for 循环来做到这一点,但是运行时间太长以至于不可行。我曾想过使用滚动联接,但对于分组数据似乎不可能(即需要为每个用户 ID 单独完成。)如何使用 data.table 的本机功能来做到这一点?

【问题讨论】:

    标签: r join merge data.table


    【解决方案1】:

    自 v1.9.6 版(CRAN 2015 年 9 月 19 日)起,shift() 函数在 data.table 中可用:

    DT[, difference := shift(numviews, type = "lead") - numviews, by = Userid][
      xeventinweek != 0L]
    
       Userid week xeventinweek numviews difference
    1:  Alice    1            2        5         -2
    2:  Alice    4            1        6         NA
    3:    Bob    2            2        3          2
    

    【讨论】:

    • 我猜你应该检查周+ 1L(也许有一个连接),而不仅仅是下一行。 OP显然缺少几周。我的意思是DT[.(u = Userid, w = week + 1L, numviews = numviews), on=.(Userid = u, week = w), i.numviews - x.numviews] 更类似于thela。
    • @Frank 我猜,你是对的。不幸的是,缺少的第 3 周正好在第 2 周之后没有事件,无论如何都不会显示。因此,仅从预期结果来看,我们不能 100% 确定 OP 想要如何处理缺少的几周。
    【解决方案2】:

    使用match

    dat[, numnextweek := numviews[match(week + 1, week)] , by=Userid]
    dat[, difference := numviews - numnextweek , by=Userid]
    dat[xeventinweek != 0]
    
    #   Userid week xeventinweek numviews numnextweek difference
    #1:  Alice    1            2        5           3          2
    #2:  Alice    4            1        6          NA         NA
    #3:    Bob    2            2        3           5         -2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多