在R中嵌套合并表格:将肽表条目嵌套至对应蛋白质条目下
解决方法
首先你的原始数据框定义存在语法错误——字符串未加引号,R会将其识别为变量而非字符值,先修正数据:
# 修正后的数据框定义 ProteinList <- data.frame( Proteins = c("A1INK5", "K1SNC9"), Abundance = c(67, 25), stringsAsFactors = FALSE ) PeptideList <- data.frame( MasterProtein = c("A1INK5", "A1INK5", "A1INK5", "K1SNC9", "K1SNC9"), Peptides = c("VSAITLEDGVYR", "TLEDGVY", "LEDGVYRTD", "KNSLRGFDDDE", "MKLSFYHPNS"), Positions = c("[1-65]", "[53-78]", "[70-88]", "[30-42]", "[41-55]"), stringsAsFactors = FALSE )
R的基础数据结构是矩形的,无法直接存储“嵌套行”格式,但可以通过两种方式实现你要的效果:
方法1:生成可视化嵌套表格(推荐,美观易读)
使用gt包可以快速创建符合需求的分组嵌套表格,适合报告展示:
安装并加载依赖包
# 首次使用先安装包 install.packages(c("dplyr", "gt")) # 加载包 library(dplyr) library(gt)
合并数据并生成表格
# 关联两个数据框 merged_data <- left_join(ProteinList, PeptideList, by = c("Proteins" = "MasterProtein")) # 创建嵌套分组表格 ProteinPeptideList <- merged_data %>% gt(groupname_col = "Proteins") %>% tab_header(title = "ProteinPeptideList") %>% cols_label( Abundance = "Abundance", Peptides = "Peptides", Positions = "Positions" ) %>% # 让每个蛋白质的丰度只显示一次 tab_style( style = cell_text(align = "left"), locations = cells_body(columns = Abundance, rows = duplicated(Abundance)) ) %>% # 重复的丰度位置留空 fmt_missing(columns = Abundance, missing_text = "") # 查看结果 ProteinPeptideList
运行后会生成一个结构化的表格:每个蛋白质仅显示一次名称和丰度,下方缩进展示对应所有肽段的信息,完全匹配你的预期格式。
方法2:生成纯文本格式表格(基础R,无需额外包)
如果只需要在控制台输出纯文本格式的嵌套表,用基础R代码即可:
# 遍历每个蛋白质 for (protein in ProteinList$Proteins) { # 打印蛋白质名称和丰度 cat(sprintf("%-10s %d\n", protein, ProteinList$Abundance[ProteinList$Proteins == protein])) # 打印肽段表头 cat(sprintf("%-10s %-18s %s\n", "", "Peptides", "Positions")) # 打印当前蛋白质对应的所有肽段 peptides_subset <- PeptideList[PeptideList$MasterProtein == protein, ] for (i in 1:nrow(peptides_subset)) { cat(sprintf("%-10s %-18s %s\n", "", peptides_subset$Peptides[i], peptides_subset$Positions[i])) } # 空行分隔不同蛋白质 cat("\n") }
这段代码会在R控制台输出你要的纯文本嵌套结构。
内容的提问来源于stack exchange,提问作者bobsmith141
相关产品推荐
相关产品推荐

