基于行为起始秒数按分钟提取瞬时行为的R语言问题
解决方法
以下是实现需求的步骤和代码:
- 转换时间格式:将
Behavior_Start转换为POSIXct类型,确保时区正确。 - 生成目标时间戳序列:以首次行为的起始时间为基准,生成每分钟的时间戳(保持起始秒数不变)。
- 计算目标时间戳的累计时长:计算每个目标时间戳相对于首次行为起始时间的累计分钟数。
- 匹配行为区间:使用
findInterval函数确定每个目标时间戳落在哪个行为的时间区间内,从而分配对应的行为。
完整代码:
# 加载原始数据 df <- data.frame(Behavior = c("GRAZ", "MLTC", "GRAZ", "MLTC", "VIGL"), Behavior_Start = c("2022-05-10 17:34:06","2022-05-10 17:38:04","2022-05-10 17:38:26","2022-05-10 17:41:49","2022-05-10 17:42:27"), Behavior_Duration_Minutes = c(0.000000,3.961683,4.325933,7.722067,8.350017)) # 将起始时间转换为带时区的POSIXct格式 df$Behavior_Start <- as.POSIXct(df$Behavior_Start, tz = "America/Denver") # 获取首次行为的起始时间 first_start <- df$Behavior_Start[1] # 生成目标时间戳:从首次行为开始,共10个每分钟的时间点 num_minutes <- 10 target_timestamps <- first_start + 0:(num_minutes-1)*60 # 计算每个目标时间戳相对于首次行为的累计分钟数 elapsed_target <- difftime(target_timestamps, first_start, units = "mins") # 定义行为区间的断点(包含最后一个行为的无限延续) breaks <- c(df$Behavior_Duration_Minutes, Inf) # 匹配每个目标时间戳对应的行为索引 behavior_idx <- findInterval(elapsed_target, breaks) # 分配对应的行为 assigned_behaviors <- df$Behavior[behavior_idx] # 构建结果数据框 new.df <- data.frame( Minute = 1:num_minutes, Timestamp = format(target_timestamps, "%Y-%m-%d %H:%M:%S"), Behavior = assigned_behaviors ) # 输出结果 print(new.df)
代码说明
findInterval函数会自动匹配每个目标时间戳所属的行为区间,确保正确获取瞬时行为。- 生成的时间戳严格遵循首次行为的起始秒数,例如首次行为始于17:34:06,后续时间戳依次为17:35:06、17:36:06等。
- 自动填充无新行为发生的分钟区间,无需手动处理缺失值。
内容的提问来源于stack exchange,提问作者jolson
相关产品推荐
相关产品推荐

