r - 受试者的一次观察与下一次观察之间的变量差异 (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)
)
解决方案
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
,不过没关系。
推荐阅读
- c# - How to modify JSON to custom structure
- java - SmsReceiver onReceive 后短信消失
- java - JSP 文件中的 doGet 有效,但 doPost 无效
- ios - 自定义单元格宽度?
- python - Django如何将一个字段的(.count)乘以另一个字段并在模板中显示结果
- html - 在裁剪和居中的图像下方创建带有文本的缩略图库
- java - 在 SparkStreaming 中没有得到输出
- html - 创建一个 CSS 按钮以在单击时显示 x 数量的文本并更改 div 标签的大小
- python - 如何获取“HTTPS”链接以及如何在 python 中将 epub 转换为 txt?
- laravel - Laravel 在涉及三个表的数据透视表上连接数据