一个对象的一次观察和下一次观察之间的变量差异 (R)

Difference in variable between one obervation for a subject and the next (R)

在我的面板数据集中,我没有特定 activity 所需的时间,只有开始 activity 的时间。这就是为什么我需要对 activity 之后的观察结果与实际观察结果之间的差异求和。

这就是为什么我现在想在我的面板数据集中创建一个新变量来指定一个观察值与下一个观察值之间的变量差异。使用示例数据集会更清楚:

示例数据集:

game_data <- data.frame(player = c(1,1,1,1,2,2,2,2), level = c(1,1,2,2,1,1,2,2), activity = c("run","run","run","swim","swim","run","run","swim"), datesec = c(0,150,170,240,100,110,180,330))
> game_data
  player level activity datesec
1      1     1      run       0
2      1     1      run     150
3      1     2      run     170
4      1     2     swim     240
5      2     1     swim     100
6      2     1      run     110
7      2     2      run     180
8      2     2     swim     330

我现在想在每次 activity "run" 之后添加一个新的时间总和变量(以秒为单位)到下一个观察(下一个 activity就是,不管是"swim"还是"run")而且即使下一个activity在下一层,也应该取下一层的第一个activity来建立差异.我也只想对每个用户的每个级别进行一次观察。

它应该是这样的:

game_data_new <- data.frame(player = c(1,1,2,2), level = c(1,2,1,2), n_run = c(2,1,1,1), n_swim = c(0,1,1,1), timeafterrun = c(170,70,70,150))
> game_data_new
  player level n_run n_swim timeafterrun
1      1     1     2      0          170
2      1     2     1      1           70
3      2     1     1      1           70
4      2     2     1      1          150

变量"timeafterrun"中的170例如由(150-0) + (170-150)计算 在这里,代码必须首先观察下一个级别,级别 2,因为级别 1 中没有进一步的 activity。

我尝试了以下方法,但我不知道要在代码中添加什么来告诉 R 它应该在 "run" 之后的下一次观察之间采用 datesec 的差异(即使它在下一次level) 和实际 "run".

game <- game %>%
  group_by(player,level) %>%
  summarize(
    n_run = sum(type == "run"),
    n_swim = sum(type == "swim"),
    timeafterrun = datesec(datesec of activity after_last_"run"-obervation) - datesec(actual_"run"-observation) 
  )
require(dplyr)
game_data %>% 
  group_by(player) %>% 
  mutate(nextdat=lead(datesec)) %>% 
  group_by(level, add=TRUE) %>% 
  mutate(timeafterrun=max(nextdat,na.rm=TRUE)-min(datesec[activity=="run"],na.rm = TRUE)) %>%
  summarize(n_run=sum(activity=="run"),n_swim=sum(activity=="swim"), timeafterrun=max(timeafterrun))

# A tibble: 4 x 5
# Groups:   player [?]
  player level n_run n_swim timeafterrun
   <dbl> <dbl> <int>  <int>        <dbl>
1      1     1     2      0          170
2      1     2     1      1           70
3      2     1     1      1           70
4      2     2     1      1          150

这是怎么回事:首先,我为每一行(在单个玩家中)创建了一个带有下一个 (lead) 日期秒的辅助列。

接下来我 group_by 玩家和关卡,并创建一个列,从组中最大的日期秒中减去具有 activity=="run" 的行的最小日期秒。

然后我summarize创建n_run和n_swim,并复制过来timeafterrun,整个组应该是一样的,所以我随意选择了max ,但这并不重要。