R中构建CDR3序列计数矩阵:多样本数据合并方法求助
在R中合并多样本CDR3克隆计数为矩阵的解决方案
你现在的需求其实是典型的宽表转换+缺失值填充问题,完全不用手动写循环处理,不管是你已经加载的工具包,还是通用的数据处理工具,都有现成的方法可以快速实现!下面给你几种不同的方案,挑你顺手的来:
方案1:用immunarch内置函数(最省心,适配你的场景)
你已经加载了immunarch,这个包本身就是专门处理免疫组库数据的,内置的repMatrix函数可以直接生成你要的计数矩阵,完全不用自己处理去重和匹配的步骤:
# 你已经用repLoad加载了数据,immdata$data就是每个样本的data.frame列表 # 直接生成计数矩阵:.method="count"指定用克隆数,.col="aa"指定用CDR3氨基酸序列作为行 count_matrix <- repMatrix(immdata$data, .method = "count", .col = "aa") # 最后把CDR3序列设为行名,去掉多余的列 rownames(count_matrix) <- count_matrix$CDR3.aa count_matrix <- count_matrix[, -which(colnames(count_matrix) == "CDR3.aa")]
这个方法最直接,后续如果还要做克隆重叠分析、多样性计算,也能直接基于这个矩阵继续用immunarch的函数处理。
方案2:用tidyverse工具包(灵活通用,适合各类表格转换)
如果你习惯用tidyverse的语法,先把所有样本的数据合并成一个长表,再转成宽表并自动填充0:
首先确保加载tidyverse(如果没装先运行install.packages("tidyverse")):
library(tidyverse)
然后处理你的数据:
# 把所有样本的data.frame按行合并,自动保留样本ID作为新列 all_combined <- bind_rows(all.c, .id = "Sample.ID") # 转换为宽表,没有匹配到的序列计数直接填充为0,最后把CDR3设为行名 count_matrix <- all_combined %>% pivot_wider(names_from = Sample.ID, values_from = Clones, values_fill = 0) %>% column_to_rownames(var = "CDR3.aa")
这个方法的优势是语法清晰,不管是免疫组库数据还是其他类型的多样本计数数据,都能用这套逻辑处理。
方案3:用你已加载的plyr包(无需额外安装)
如果你不想新加工具包,用你已经加载的plyr也能搞定,步骤稍微多一点但兼容性好:
# 合并所有样本数据为一个长表,保留样本ID all_combined <- ldply(all.c, data.frame, .id = "Sample.ID") # 转换为宽表格式 count_matrix <- reshape(all_combined, idvar = "CDR3.aa", timevar = "Sample.ID", direction = "wide") # 清理列名(去掉自动生成的"Clones."前缀),并把NA替换为0 colnames(count_matrix) <- str_remove(colnames(count_matrix), "Clones.") count_matrix[is.na(count_matrix)] <- 0 # 设置行名并去掉多余列 rownames(count_matrix) <- count_matrix$CDR3.aa count_matrix <- count_matrix[, -which(colnames(count_matrix) == "CDR3.aa")]
内容的提问来源于stack exchange,提问作者Lou_A
相关产品推荐
相关产品推荐

