R语言如何处理列表中的tibble,合并多受试者xlsx并按event_number拆分?
基于现有代码的实现方案
首先先修正你现有analyze函数的错误:函数中调用的df[[i]]未定义变量i,lapply遍历的每个受试者数据会直接传入函数参数,修改后代码如下:
library(purrr) library(dplyr) library(tidyr) library(readxl) # 修正后的分析函数 analyze <- function(subj_df) { file_subj <- separate_rows(subj_df, 1, sep = ",") split(file_subj, file_subj$event_number) } bb <- lapply(df, FUN = analyze)
此时bb是两层嵌套列表:第一层为18个受试者,第二层为每个受试者拆分后的40个event对应子数据集。后续只需要按event维度转置后合并即可:
# 转置列表:第一层变为event编号,第二层为18个受试者对应该event的数据 event_transposed <- transpose(bb) # 对每个event下的18条数据做行合并,得到40个目标数据框 final_result <- map(event_transposed, bind_rows)
最终final_result就是你需要的40个数据框列表,final_result[[x]]对应event_number=x的18行数据集。
更简洁的一体化实现
你可以跳过分拆后再合并的步骤,直接读入所有数据后拆分,代码更易维护:
library(tidyverse) library(readxl) path <- "my_path" # 批量读入所有文件,新增受试者编号列 all_subj_data <- list.files(path, pattern = "\\.xlsx$", recursive = TRUE, full.names = TRUE) %>% imap_dfr(~ read_xlsx(.x) %>% separate_rows(1, sep = ",") %>% mutate(subject_id = .y) # 不需要保留受试者编号可删除该行 ) # 直接按event_number拆分得到40个目标数据框 final_result <- split(all_subj_data, all_subj_data$event_number)
内容的提问来源于stack exchange,提问作者nes
相关产品推荐
相关产品推荐

