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

在R中对跨多区间的起止时间行为数据进行时长分箱

跨分钟区间的行为时长统计与可视化方案

1. 加载依赖包与导入数据

首先加载tidyverse包(整合了数据处理、拆分及绘图工具),然后导入你的数据:

library(tidyverse)

# 导入示例数据(替换为你的实际数据读取代码,比如read_csv())
df <- tibble(
  Individual = c("M1", "M1", "M1", "M1"),
  Behavior = c("A", "B", "E", "E"),
  start = c(0, 1.505, 3.266, 71.268),
  end = c(1.505, 106.256, 67.255, 77.506),
  duration = c(1.505, 104.751, 63.989, 6.238)
)

2. 拆分跨区间的行为记录

核心是把跨多个1分钟区间的行为拆分成单区间记录,计算每个区间内的实际耗时:

df_split <- df %>%
  mutate(
    # 计算行为覆盖的起始/结束区间编号(第1区间对应0-60秒)
    interval_start = floor(start / 60) + 1,
    interval_end = floor(end / 60) + 1,
    # 生成该行为覆盖的所有区间编号
    interval = map2(interval_start, interval_end, seq)
  ) %>%
  unnest(interval) %>%
  mutate(
    # 计算当前区间的时间范围
    interval_low = (interval - 1) * 60,
    interval_high = interval * 60,
    # 计算行为在当前区间的实际耗时:取行为与区间的重叠部分时长
    interval_duration = pmin(end, interval_high) - pmax(start, interval_low)
  ) %>%
  select(Individual, Behavior, interval, interval_duration)

这段代码会自动拆分跨区间的行为,比如示例中行为B会被拆成区间1(时长58.495秒)和区间2(时长46.256秒)两条记录,与你的预期一致。

3. 补全缺失区间并汇总时长

为了得到每个个体、每个区间、每个行为的完整时长(包括耗时为0的情况),补全所有可能的组合并汇总:

# 生成所有个体-区间-行为的组合
all_combinations <- df_split %>%
  expand(Individual, interval, Behavior)

# 合并数据并填充缺失值为0
df_summary <- all_combinations %>%
  left_join(df_split, by = c("Individual", "interval", "Behavior")) %>%
  mutate(interval_duration = replace_na(interval_duration, 0)) %>%
  group_by(Individual, interval, Behavior) %>%
  summarise(total_duration = sum(interval_duration), .groups = "drop")

运行后即可得到你示例中的结果,比如M1在第2区间的行为A时长为0。

4. 按实验组计算平均时长

如果你的数据包含实验组信息(如每个个体对应Group1/Group2),添加Group字段后按组、区间、行为计算平均:

# 示例:为个体添加分组(替换为你的实际分组逻辑)
df_with_group <- df_summary %>%
  mutate(Group = ifelse(Individual == "M1", "GroupA", "GroupB"))

# 按实验组计算平均耗时
group_avg <- df_with_group %>%
  group_by(Group, interval, Behavior) %>%
  summarise(avg_duration = mean(total_duration), .groups = "drop")

5. 绘制折线图

用ggplot2绘制折线图,区分不同行为的耗时变化:

# 个体级折线图
ggplot(df_summary, aes(x = interval, y = total_duration, color = Behavior, group = Behavior)) +
  geom_line() +
  geom_point() +
  labs(x = "1分钟区间", y = "耗时(秒)", color = "行为类型") +
  theme_minimal()

# 实验组平均折线图(按组分面)
ggplot(group_avg, aes(x = interval, y = avg_duration, color = Behavior, group = Behavior)) +
  geom_line() +
  geom_point() +
  facet_wrap(~Group) +
  labs(x = "1分钟区间", y = "平均耗时(秒)", color = "行为类型") +
  theme_minimal()

内容的提问来源于stack exchange,提问作者ren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:07:16