首页 > 解决方案 > 受试者的一次观察与下一次观察之间的变量差异 (R)

问题描述

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

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

示例数据集:

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

我现在想为每个活动“运行”到下一个观察后的时间总和添加一个新变量(下一个活动是什么,无论是“游泳”还是“跑步”),即使下一个活动是在下一个级别,它应该采取下一个级别的第一个活动来建立差异。我也只想对每个用户的每个级别进行一次观察。

它应该如下所示:

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级。

我已经尝试了以下方法,但我不知道要在代码中添加什么来告诉 R 它应该在“运行”之后的下一次观察(即使它在下一个级别)和实际的“运行”之间采用 datesec 的差异”。

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) 
  )

标签: rdplyrtransformpaneldifference

解决方案


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为每一行(在单个玩家中)创建一个带有下一个 ( ) datesec 的辅助列。

接下来,我group_by将玩家和关卡都放在一起,并创建一个列,activity=="run"从组中最大的 datesec 中减去行的最小 datesec。

然后我summarize创建n_run和n_swim,在timeafterrun中复制,应该是整个组都一样,所以我随意挑了max,不过没关系。


推荐阅读