如何在R中实现垂直跳跃力数据的滚动SD/均值占比计算?
垂直跳跃力数据的称重阶段识别(R实现)
需求背景
- 数据集:垂直跳跃过程中记录的垂直力数据,最多包含10000条观测值,采样频率1000Hz
- 试验起始特征:受试者会先静止站立1-4秒(对应1000-4000条观测值)
- 核心任务:通过滑动窗口分析找到最稳定的静止窗口,以此确定体重,进而计算受试者质心速度
- 稳定窗口判定规则:
- 对连续100条数据的滑动窗口(对应100ms)计算力的均值
- 计算同一窗口内的标准差(SD)
- 计算
(SD/均值)*100的占比,选取占比最小的窗口,以此窗口为中心取前后各50条数据作为「称重阶段」
修正后的R代码实现
# 安装并加载所需工具包 if (!require("runner")) install.packages("runner") library(runner) if (!require("pracma")) install.packages("pracma") library(pracma) # 提取力数据(假设输入数据框名为force,力值列名为Force) f <- force$Force # 滑动窗口参数:100ms对应100条采样数据 window_size <- 100 # 一次性计算所有滑动窗口的均值和标准差 rolling_stats <- runner( x = f, k = window_size, f = function(x) c(mean_val = mean(x), sd_val = sd(x)) ) # 转换为数据框便于后续处理 rolling_stats_df <- as.data.frame(rolling_stats) # 计算标准差与均值的百分比占比 rolling_stats_df$ratio <- (rolling_stats_df$sd_val / rolling_stats_df$mean_val) * 100 # 找到占比最小的窗口索引 min_ratio_idx <- which.min(rolling_stats_df$ratio) # 确定称重阶段的索引范围:以最小占比窗口为中心,前后各取50条 center_idx <- min_ratio_idx + window_size / 2 weighing_start <- center_idx - 50 weighing_end <- center_idx + 50 # 提取称重阶段的力数据 weighing_data <- f[weighing_start:weighing_end] # 计算体重(称重阶段的平均力值) body_weight <- mean(weighing_data) # 计算受试者质量(重力加速度取9.81 m/s²) mass <- body_weight / 9.81 # 计算质心速度:(力值-体重)/质量 积分得到速度 force_minus_weight <- f - body_weight acceleration <- force_minus_weight / mass # 除以采样率1000Hz,将采样点间隔转换为时间单位 velocity <- cumtrapz(acceleration) / 1000
代码说明
- 合并滑动窗口的均值与标准差计算,减少重复运算,提升大数据处理效率
- 用
which.min直接定位最小占比窗口,避免原代码中重复值匹配的问题 - 明确计算称重阶段的索引范围,确保准确取到中心前后各50条数据
- 补充了从体重到质心速度的完整计算流程,贴合原始需求
内容的提问来源于stack exchange,提问作者Jason Lake
相关产品推荐
相关产品推荐

