在R语言中求嵌套列表各会话对应zmat矩阵的逐元素平均值
解决嵌套列表中多受试者会话矩阵的逐元素平均问题
基础R实现(无需额外包)
提取目标会话的所有矩阵
以第1会话为例,提取所有受试者的zmat矩阵(自动跳过不存在该会话的受试者):session1_mats <- Filter(Negate(is.null), lapply(dat, function(subj) subj[[1]]$zmat))计算逐元素平均值
通过Reduce对所有矩阵对应元素求和,再除以有效矩阵的数量:mean_session1 <- Reduce(`+`, session1_mats) / length(session1_mats)重复上述步骤,将
[[1]]替换为[[2]]、[[3]]即可得到第2、3会话的平均矩阵。
tidyverse(purrr包)实现(更简洁)
先加载purrr包:
library(purrr)
定义通用计算函数
写一个函数处理任意会话的平均计算:compute_session_mean <- function(session_idx) { dat %>% map(~ .x[[session_idx]]$zmat) %>% compact() %>% # 移除缺失会话产生的NULL元素 reduce(`+`) %>% # 所有矩阵逐元素求和 divide_by(length(.)) # 除以有效矩阵数量 }批量计算三个会话的平均矩阵
# 得到包含三个会话平均矩阵的列表,顺序对应会话1-3 session_means <- map(1:3, compute_session_mean)
注意事项
- 如果所有受试者都有完整的3个会话,可以去掉
Filter或compact()步骤,直接用length(dat)作为分母。 - 每个
zmat必须是维度一致的矩阵(这里是12×12),否则会报错。
内容的提问来源于stack exchange,提问作者chainhomelow
相关产品推荐
相关产品推荐

