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
相关产品推荐
相关产品推荐

