比较下一行,分组,data.table

时间:2014-09-08 06:24:20

标签: r join merge data.table

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

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

因此,在这种情况下,Alice在第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和difference列并不是必需的 - 或者是好的。

我能够使用data.table和for循环执行此操作,但运行时间太长,这是不可行的。我想过使用滚动连接,但是对于分组数据似乎不可能(即,它需要为每个Userid单独完成。)如何使用data.table的本机功能来完成此操作?

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:1)

自版本v1.9.6(2015年9月19日CRAN)以来,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