在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
相关产品推荐
相关产品推荐

