如何在R中为每个独立行为事件应用滚动窗口函数?
解决独立行为事件的滚动窗口计算问题
第一步:给独立行为事件添加编号
要区分连续的相同行为事件,我们可以给每个连续的行为段生成唯一编号(比如Standing1、Standing2),以下是几种实现方式:
方法1:用data.table包(高效简洁)
library(data.table) setDT(df) # 生成带行为名称的事件编号,比如Standing1、Walking2 df[, Event := paste0(Behaviour, rleid(Behaviour))]
rleid()函数会为连续相同的Behaviour值分配递增的ID,拼接后就能得到每个独立事件的唯一标识。
方法2:用dplyr包
library(dplyr) df <- df %>% mutate(Event = paste0(Behaviour, cumsum(c(TRUE, diff(as.integer(factor(Behaviour))) != 0))))
通过判断前后行的行为是否变化,用cumsum()生成递增的事件ID。
方法3:Base R实现(无需额外包)
df$Event <- with(df, paste0(Behaviour, cumsum(c(1, diff(match(Behaviour, unique(Behaviour))) != 0))))
第二步:按事件分组做滚动窗口计算
有了事件编号后,我们就可以针对每个独立事件单独计算滚动窗口特征,避免跨事件的问题:
方法1:用dplyr + zoo
library(zoo) # 筛选目标行为,按事件分组后逐个处理 result_list <- df %>% filter(Behaviour == behaviour) %>% group_split(Event) %>% lapply(function(group) { rollapply(group$X_accel, FUN = time_domain_summary, width = window.size, by = window.step, align = "left", partial = FALSE) })
group_split()会把数据拆分成每个事件对应的子数据集,再用lapply()对每个子数据集单独执行滚动窗口计算。
方法2:用data.table + zoo(大数据场景更高效)
library(zoo) # 按Event分组计算,结果保留事件编号和对应的特征列表 result_dt <- df[Behaviour == behaviour, .(features = list(rollapply(X_accel, FUN = time_domain_summary, width = window.size, by = window.step, align = "left", partial = FALSE))), by = Event]
这种方式直接在data.table中按Event分组计算,结果以表格形式返回,每行对应一个事件的特征列表。
方法3:Base R实现
library(zoo) # 筛选目标行为数据 target_data <- df[df$Behaviour == behaviour, ] # 按Event拆分成独立组 event_groups <- split(target_data, target_data$Event) # 逐个组计算滚动窗口特征 result_list <- lapply(event_groups, function(group) { rollapply(group$X_accel, FUN = time_domain_summary, width = window.size, by = window.step, align = "left", partial = FALSE) })
关键说明
原来的代码会把所有目标行为的行合并成一个整体计算,导致滚动窗口跨越不同的独立事件。通过先给连续的行为段添加唯一编号,再按编号分组计算,就能确保每个事件的滚动窗口计算都是独立进行的,不会出现跨事件的情况。
内容的提问来源于stack exchange,提问作者mari davies
相关产品推荐
相关产品推荐

