You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于速度条件与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:35:09