在我的面板数据集中,我没有特定活动所需的时间,只有开始活动的时间 . 这就是为什么我需要从活动后的观察结果与实际观察结果之间的差异中得出一个总和 .
这就是为什么我现在想在我的面板数据集中创建一个新变量,它指定一个变量和下一个变量之间的变量差异 . 使用示例数据集可以更清楚:
示例数据集:
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
我现在想要为每个活动“运行”到下一次观察后的时间总和添加一个新变量(无论下一个活动是什么,无论是“游泳”还是“跑步”),即使下一个活动是在下一个级别,它应该采取下一个级别的第一个活动来 Build 差异 . 我也只想为每个用户对每个级别进行一次观察 .
它应该如下所示:
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它应该在“运行”之后的下一个obervation(即使是在下一级别)和实际的“运行”之间采用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)
)
1 回答
这里's what'继续:首先,我为每一行(在一个单独的玩家中)创建一个辅助列,下一个(
lead
)datesec .接下来我将同时使用播放器和级别,并创建一个列,该列从组中最大的datesec减去具有
activity=="run"
的行的最小datesec .然后我
summarize
创建n_run和n_swim,并复制timeafterrun,这对于整个组应该是相同的,所以我随意选择了max
,但这并不重要 .