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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:28:13