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

R语言实现多试次时间序列同索引均值计算及平均图绘制

R语言实现逐试次对齐采样点计算平均时序信号

你不需要先把长格式数据转为宽格式,以下分别提供你要求的for循环实现方案,以及适配大数据量的高效向量化方案,最终都可以得到长度等于单试次采样点数的平均瞳孔值向量,直接用于绘制平均曲线。


方案1:使用for循环实现

逻辑为:先确认单试次的采样点总数,逐位置遍历提取所有试次对应位置的瞳孔大小值,计算均值存入结果向量即可,仅需1层循环即可完成。

# 先构造示例测试数据
df <- data.frame(
  Pupil_Size = c(500,502,504,506,508,507,508,510,511,512,513,515,514,512,515),
  TrialNum = c(rep(1,5), rep(2,5), rep(3,5))
)

# 配置参数
all_trials <- unique(df$TrialNum)
sample_count_per_trial <- 5 # 实际1000Hz数据替换为单试次对应采样点数,即100
average_size <- numeric(sample_count_per_trial) # 初始化存储均值的向量

# 循环计算每个位置的跨试次均值
for (pos in 1:sample_count_per_trial) {
  # 提取当前位置所有试次的瞳孔值
  current_pos_vals <- sapply(all_trials, function(tid){
    df$Pupil_Size[df$TrialNum == tid][pos]
  })
  average_size[pos] <- mean(current_pos_vals)
}

方案2:高效向量化实现(无循环,适配大数据量)

1000Hz采样下数据点总量大,循环运行效率偏低,可以直接给每个试次内的采样点添加顺序位置索引,再按位置分组求均值,代码更简洁运行更快:

library(dplyr)

avg_result <- df %>%
  group_by(TrialNum) %>%
  # 按原始行顺序给每个试次内的采样点标记位置序号
  mutate(sample_pos = row_number()) %>%
  ungroup() %>%
  # 按位置分组跨试次求均值
  group_by(sample_pos) %>%
  summarise(average_pupil_size = mean(Pupil_Size), .groups = "drop")

# 提取为向量即可直接用于绘图
average_size <- avg_result$average_pupil_size

注意事项

运行前请确认所有试次的采样点数量完全一致,且数据框内的行顺序没有被打乱,否则位置索引会错位,导致平均结果失真。
你给出的示例预期结果是取整后的数值,原始计算结果为c(506.67, 508.33, 509.33, 509.67, 511.67),如果需要和示例完全一致,调用round(average_size)即可得到整数结果。


内容的提问来源于stack exchange,提问作者Daniel Frazer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:18:51