如何批量处理数据框列,基于另一数据框生成分组统计汇总表?
批量实现基于数据框列筛选的分组汇总
需求说明
针对sites_df的每一列,提取该列的非NA唯一值,筛选compartments中Protein属于这些值的行,按compartment分组计数,最终合并为汇总表,需要批量处理替代手动逐列操作。
给定数据
1. sites_df数据框
生成代码:
set.seed(1) sites_df <- data.frame(QC1 = sample(c(LETTERS[1:6],NA,NA), size =10, replace = T) ,QC2 = sample(c(LETTERS[2:7],NA,NA), size =10, replace = T) ,QC3 = sample(c(LETTERS[1:8],NA), size =10, replace = T))
数据展示:
> sites_df QC1 QC2 QC3 1 A D <NA> 2 D D E 3 <NA> B E 4 A F <NA> 5 B F <NA> 6 E C E 7 <NA> G E 8 C G B 9 F C <NA> 10 B <NA> A
2. compartments数据框
生成代码:
set.seed(1) compartments <- data.frame(Protein = sample((LETTERS[1:8]), size =20, replace = T) ,compartment = paste0("comp", LETTERS[1:4])) %>% unique()
数据展示:
> compartments Protein compartment 1 A compA 2 D compB 3 G compC 4 A compD 5 B compA 6 E compB 8 C compD 9 F compA 10 B compB 11 C compC 15 E compC 16 B compD 18 F compB 19 B compC 20 G compD
批量处理实现方法
使用tidyverse工具集(dplyr+purrr)实现批量处理,步骤如下:
- 遍历
sites_df的每一列,提取非NA唯一值; - 针对每个列的筛选值,在
compartments中筛选对应行并按compartment计数; - 将各列的计数结果合并为汇总表,保留列名标识。
完整代码
library(tidyverse) # 定义处理单列的函数 process_col <- function(col_data, col_name) { # 提取当前列的非NA唯一值 valid_proteins <- col_data %>% na.omit() %>% unique() # 筛选compartments并分组计数 compartments %>% filter(Protein %in% valid_proteins) %>% count(compartment, name = col_name) } # 批量处理所有列并合并结果 result_df <- sites_df %>% imap_dfr(process_col, .id = "QC_col") %>% pivot_wider(names_from = QC_col, values_from = starts_with("QC"), values_fill = 0) # 查看结果 result_df
输出示例
运行代码后会得到如下格式的汇总表,每个QC列对应各compartment的计数:
# A tibble: 4 × 4 compartment QC1 QC2 QC3 <chr> <int> <int> <int> 1 compA 3 2 2 2 compB 2 3 2 3 compC 1 3 2 4 compD 2 2 1
内容的提问来源于stack exchange,提问作者Wera
相关产品推荐
相关产品推荐

