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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:07