我有一个数据框,其中包含每个用户每周的页面浏览量。我想为每个用户确定他们的观点在特定事件后是增加,减少还是保持不变。我的数据如下:
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的本机功能来完成此操作?
答案 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