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

如何为加速度计数据的滚动窗口分析结果关联行为标签?

问题解决:滚动窗口特征提取保留行为标签

需求说明

  • 对带行为标签的加速度计数据做滚动窗口时域特征提取
  • 要求输出结果关联对应的行为标签,支持两种形式:新增Behaviour列,或设置行名为"时间范围 行为"格式
  • 适配大规模数据集,自动排除行为时长不足窗口大小的样本

修改后代码实现

library(zoo)
library(dplyr)

df1 <- read.table(text = "\nTime    X_accel  y_accel   Behaviour\n1   0.01  0.1  Standing\n2   0.01  0.2  Standing\n3   0.01  0.2  Standing\n4   0.02  0.1  Standing\n5   0.06  0.8  Walking\n6   0.07   0.8 Walking\n7   0.01  0.2  Standing\n8   0.02  0.2  Standing\n9   0.01  0.1  Standing\n10  0.9   0.95 Flying            \n11  0.95  0.99 Flying\n12  0.9   0.95 Flying",
                  header = TRUE)

# 采样参数设置
sampling.interval = 2
duration = 1
step = 0.1
window.size = sampling.interval*duration
window.step = step*window.size

# 时域特征提取函数
time_domain_summary <- function(values) {
  features <- data.frame(
    x_mean = mean(values[,1], na.rm = TRUE),
    x_median = quantile(values[,1], probs = c(0.5), na.rm = TRUE), 
    x_mx =  max(values[,1], na.rm = T),
    x_mn = min(values[,1], na.rm = T), 
    x_sd = sd(values[,1]),
    x_range = max(values[,1], na.rm = T) - min(values[,1], na.rm = T),
    # 处理y轴加速度特征
    y_mean = mean(values[,2], na.rm = TRUE),
    y_median = quantile(values[,2], probs = c(0.5), na.rm = TRUE), 
    y_mx =  max(values[,2], na.rm = T),
    y_mn = min(values[,2], na.rm = T), 
    y_sd = sd(values[,2]),
    y_range = max(values[,2], na.rm = T) - min(values[,2], na.rm = T)
  )
  return(features)
}  

# 按行为连续片段分组
f <- cumsum(c(0, df1$Behaviour[-1] != df1$Behaviour[-nrow(df1)]))

# 分组处理:保留行为标签与窗口时间范围
list <- by(df1, f, function(g) {
  current_behav <- g$Behaviour[1]
  accel_data <- g[, c("X_accel", "y_accel")]
  
  # 计算滚动窗口特征,自动过滤不足窗口大小的片段
  features <- rollapply(accel_data, 
                        FUN = time_domain_summary, 
                        width = window.size, 
                        by = window.step, 
                        align = "left", 
                        partial = FALSE)
  
  if(nrow(features) == 0) return(NULL)
  
  # 获取每个窗口的时间范围
  window_indices <- rollapply(seq(nrow(g)), 
                              width = window.size, 
                              by = window.step, 
                              align = "left", 
                              partial = FALSE,
                              FUN = function(idx) c(min(g$Time[idx]), max(g$Time[idx])))
  
  # 合并时间范围、行为标签与特征
  result <- cbind(
    Time_Range = apply(window_indices, 1, function(x) paste(x, collapse = "-")),
    Behaviour = current_behav,
    features
  )
  return(result)
})

# 合并结果并过滤空片段
df2 <- do.call(rbind, Filter(Negate(is.null), list))

# 可选:设置行名为"时间范围 行为"格式
rownames(df2) <- paste(df2$Time_Range, df2$Behaviour)

关键修改点

  • 分组时保留完整数据:将df1整体传入by函数,而非仅加速度列,方便获取行为标签
  • 自动过滤无效片段:若分组行数不足窗口大小,rollapply返回空数据框,通过Filter(Negate(is.null))排除这类无效结果
  • 关联窗口时间与标签:计算每个窗口的起始/结束时间,与行为标签一起合并到特征结果中
  • 灵活调整输出形式:既可以保留Behaviour列,也可以将时间范围+标签设置为行名

内容的提问来源于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.26 07:37:58