从tibble列表提取指定系数(含p值):Base R与purrr实现方案
解决方案:从tibble列表中提取指定行并保留列表名称
问题需求
给定一个包含多个tibble的列表,需要批量提取每个tibble中term为time和grup_int的行,保留term、p.value字段,并将每个tibble的列表名称作为新列Var。以下提供两种实现方案:
方案一:Base R(apply系列函数)
使用Map函数同时遍历列表和对应的名称,结合Base R原生操作完成筛选与合并:
# 定义要提取的目标term selected_terms <- c("time", "grup_int") # 遍历列表并处理每个tibble result_base <- Map(function(df, name) { # 筛选指定term的行,提取目标列 subset_df <- df[df$term %in% selected_terms, c("term", "p.value")] # 添加Var列存储当前tibble的列表名称 subset_df$Var <- name # 调整列顺序为Var、term、p.value subset_df[, c("Var", "term", "p.value")] }, sample, names(sample)) # 合并所有子数据框为一个整体 result_base <- do.call(rbind, result_base) # 可选:转换为tibble格式 result_base <- as_tibble(result_base)
运行结果示例:
# A tibble: 6 × 3 Var term p.value <chr> <chr> <dbl> 1 ppara time 0.953 2 ppara grup_int 0.373 3 ppard time 0.0669 4 ppard grup_int 0.458 5 pparg time 0.721 6 pparg grup_int 0.614
方案二:purrr::map系列函数
结合purrr的map2_df函数(自动合并结果)和dplyr管道操作,代码更简洁直观:
library(purrr) library(dplyr) # 定义要提取的目标term selected_terms <- c("time", "grup_int") # 遍历列表并处理,自动合并为最终tibble result_purrr <- map2_df(sample, names(sample), function(df, name) { df %>% filter(term %in% selected_terms) %>% # 筛选指定term的行 select(term, p.value) %>% # 提取目标字段 mutate(Var = name) %>% # 添加列表名称列 relocate(Var) # 将Var列移至首位 })
运行结果与Base R方案完全一致。
内容的提问来源于stack exchange,提问作者Javier Hernando
相关产品推荐
相关产品推荐

