如何使用R依据另一数据框的列名分类规则重分类并合并数据框多列
实现方法
你需要的是按df2给出的通路分类,对df1同一通路下的所有列按行取逻辑或(只要该样本对应通路下任意基因取值为TRUE,合并后该通路列就为TRUE),以下是两种常用实现方案:
方法1:tidyverse 实现(可读性高)
library(tidyverse) df3 <- df1 %>% as.data.frame() %>% rownames_to_column("sample_id") %>% # 转长格式关联分类信息 pivot_longer(-sample_id, names_to = "Gene", values_to = "value") %>% left_join(df2, by = "Gene") %>% # 按样本+通路分组取逻辑或 group_by(sample_id, Pathway) %>% summarise(value = any(value), .groups = "drop") %>% # 转宽格式还原结构 pivot_wider(names_from = "Pathway", values_from = "value") %>% column_to_rownames("sample_id") %>% # 调整列顺序匹配你给出的示例 select(D, B, A, C)
方法2:base R 实现(代码简洁)
# 构造df1列名对应的通路分组映射 col_group <- setNames(df2$Pathway, df2$Gene)[colnames(df1)] # 遍历每个通路,按行计算逻辑或 df3 <- sapply(unique(col_group), function(p) apply(df1[, col_group == p, drop = F], 1, any)) # 调整列顺序匹配示例 df3 <- df3[, c("D", "B", "A", "C")]
内容的提问来源于stack exchange,提问作者Lin Caijin
相关产品推荐
相关产品推荐

