如何在R中基于数据框的成对列批量生成新分组列
批量生成R数据框的配对分组列解决方案
方法一:使用tidyr重塑+批量计算(推荐,自动配对)
这种方法通过正则拆分列名自动识别FF/FFPE配对,无需手动指定列,适合70列的大规模数据:
library(tidyverse) # 示例数据 gene <- c("gene1", "gene2", "gene3", "gene4") FF1 <- c(10,20,30,40) FFPE1 <- c(10,9,2,1) FF2 <- c(0,2,50,60) FFPE2 <- c(10,10,100,200) expression <- data.frame(gene, FF1, FFPE1, FF2, FFPE2) # 核心处理代码 result <- expression %>% # 宽格式转长格式,拆分样本类型和分组编号 pivot_longer( cols = -gene, names_to = c("sample_type", "group_id"), names_pattern = "(FF|FFPE)(\\d+)" # 正则匹配列名的类型与数字后缀 ) %>% # 转回宽格式,让FF和FFPE成为同一行的两列 pivot_wider( names_from = sample_type, values_from = value ) %>% # 按规则生成分组值 mutate( group = case_when( FF > 5 & FFPE > 5 ~ 3, FF > 5 & FFPE <= 5 ~ 1, FF <= 5 & FFPE > 5 ~ 2, TRUE ~ 0 # 处理两者都不大于5的情况,可按需修改 ) ) %>% # 分组列转回宽格式,匹配原数据结构 pivot_wider( names_from = group_id, values_from = group, names_prefix = "group" ) %>% # 合并回原数据框 left_join(expression, ., by = "gene") # 查看结果 print(result)
运行后会自动生成所有配对的分组列,完全匹配你期望的输出格式。
方法二:手动配对列+批量计算(适合精确控制配对场景)
如果需要明确指定FF与FFPE的配对关系,可使用这种方法:
library(tidyverse) # 提取并按数字排序配对FF/FFPE列 sample_cols <- colnames(expression)[-1] ff_cols <- str_subset(sample_cols, "^FF\\d+$") %>% arrange(as.numeric(str_extract(., "\\d+"))) ffpe_cols <- str_subset(sample_cols, "^FFPE\\d+$") %>% arrange(as.numeric(str_extract(., "\\d+"))) # 批量生成分组列 group_data <- map2_dfc(ff_cols, ffpe_cols, function(ff_col, ffpe_col) { case_when( expression[[ff_col]] > 5 & expression[[ffpe_col]] > 5 ~ 3, expression[[ff_col]] > 5 & expression[[ffpe_col]] <= 5 ~ 1, expression[[ff_col]] <= 5 & expression[[ffpe_col]] > 5 ~ 2, TRUE ~ 0 ) %>% set_names(str_c("group", str_extract(ff_col, "\\d+"))) }) # 合并到原数据框 result <- bind_cols(expression, group_data)
关键说明
- 两种方法都支持6万多行的大数据量,tidyverse函数处理这类数据效率足够。
case_when中的TRUE ~ 0用于处理两个值都不大于5的情况,若不需要该分类,可改为NA或直接删除该行。- 正则表达式
(FF|FFPE)(\\d+)确保准确匹配列名中的前缀与数字后缀,避免配对错误。
内容的提问来源于stack exchange,提问作者mfeldbauer
相关产品推荐
相关产品推荐

