如何基于速度条件与time变量生成Waiting time(s)变量并分组对比?
解决方案
核心逻辑
先按ID和Junction分组,识别每个参与者在对应路口中速度低于2KPH的连续时段,计算单时段时长后求和得到总等待时长;再基于group和experience字段做分组统计对比。
方案1:R语言(dplyr实现)
假设数据集名为df,执行以下代码:
library(dplyr) # 处理等待时长并生成新变量 df_processed <- df %>% arrange(ID, Junction, `time (s)`) %>% group_by(ID, Junction) %>% mutate( is_waiting = `speed (KPH)` < 2, # 划分连续等待的时段组 wait_group = cumsum(!is_waiting) ) %>% group_by(ID, Junction, wait_group) %>% mutate( # 计算单时段等待时长 segment_duration = ifelse(is_waiting, max(`time (s)`) - min(`time (s)`), 0) ) %>% group_by(ID, Junction) %>% mutate( # 生成总等待时长变量 `Waiting time (s)` = sum(segment_duration[is_waiting]) ) %>% ungroup() # 按group和experience做对比统计 summary_df <- df_processed %>% distinct(ID, group, experience, Junction, `Waiting time (s)`) %>% group_by(group, experience) %>% summarise( avg_wait = mean(`Waiting time (s)`), median_wait = median(`Waiting time (s)`), min_wait = min(`Waiting time (s)`), max_wait = max(`Waiting time (s)`), participant_count = n_distinct(ID) )
代码说明
arrange确保每个参与者的时间序列按顺序排列is_waiting标记当前行是否处于等待状态(speed<2)wait_group通过累积非等待状态的次数,拆分连续等待的独立时段- 先计算单时段时长,再按ID+Junction求和得到总等待时长
- 最后通过去重和分组聚合,得到不同分组的等待时长统计指标
方案2:Python(pandas实现)
假设数据集名为df,执行以下代码:
import pandas as pd # 排序确保时间序列正确 df = df.sort_values(by=['ID', 'Junction', 'time (s)']) # 标记等待状态与连续时段组 df['is_waiting'] = df['speed (KPH)'] < 2 df['wait_group'] = df.groupby(['ID', 'Junction'])['is_waiting'].apply( lambda x: (~x).cumsum() ).reset_index(level=[0,1], drop=True) # 计算单时段等待时长 def calc_segment_duration(group): if group['is_waiting'].any(): return group['time (s)'].max() - group['time (s)'].min() return 0 df['segment_duration'] = df.groupby(['ID', 'Junction', 'wait_group']).apply( calc_segment_duration ).reset_index(level=[0,1,2], drop=True) # 生成总等待时长变量 df['Waiting time (s)'] = df.groupby(['ID', 'Junction'])['segment_duration'].transform( lambda x: x[x>0].sum() ) # 按group和experience做对比统计 summary_df = df.drop_duplicates(subset=['ID', 'group', 'experience', 'Junction']).groupby( ['group', 'experience'] ).agg( avg_wait=('Waiting time (s)', 'mean'), median_wait=('Waiting time (s)', 'median'), min_wait=('Waiting time (s)', 'min'), max_wait=('Waiting time (s)', 'max'), participant_count=('ID', 'nunique') ).reset_index()
代码说明
- 先按ID、路口、时间排序,保证时序逻辑正确
- 用反向累积的方式划分连续等待时段,避免非等待状态干扰
- 自定义函数计算单时段时长,再按ID+路口求和得到总等待时长
- 去重后分组聚合,输出不同分组的等待时长对比数据
结果验证
以你提供的示例数据为例:
- ID1在ROW1-A的等待时长为
64.2 - 61.2 = 3秒 - ID2在ROW1-A的等待时长为
33.5 - 28.5 = 5秒
运行代码后,Waiting time (s)列会正确输出该值,summary_df则会展示不同group和experience组的平均、中位数等对比指标。
内容的提问来源于stack exchange,提问作者VerbalNinja
相关产品推荐
相关产品推荐

