如何拼接位置矩阵单行指定字符元素以匹配proteins表的HLA蛋白序列
问题描述
这是我第一次在此发帖,我对编程整体非常陌生,恳请各位见谅。
背景信息
我当前需要对肽段与HLA序列进行定位,从而将对应的HLA等位基因蛋白序列添加到我的'Proteins'文件中。我已知可发生结合的肽段与HLA等位基因组合,但需要通过位置矩阵获取HLA等位基因的精确蛋白序列。
我有一个名为proteins的.csv文件,格式如下:
Peptide,HLA,Binding KLEDLERDL,HLA-A*02:01,Positive-Low EVMPVSMAK,HLA-A*03:01,Positive-Intermediate EVMPVSMAK,HLA-A*11:01,Positive-High KTFPPTEPK,HLA-A*03:01,Positive-Intermediate KTFPPTEPK,HLA-A*11:01,Positive-Intermediate ATFSVPMEK,HLA-A*03:01,Positive-Intermediate ATFSVPMEK,HLA-A*11:01,Positive-High
同时我有一个位置矩阵.tsv文件,格式如下,此处仅展示文件中第一个等位基因A01:01*的内容:
allele P-25 P-24 P-23 P-22 P-21 P-20 P-19 P-18 P-17 P-16 P-15 P-14 P-13 P-12 P-11 P-10 P-9 P-8 P-7 P-6 P-5 P-4 P-3 P-2 P-1 P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 P48 P49 P50 P51 P52 P53 P54 P55 P56 P57 P58 P59 P60 P61 P62 P63 P64 P65 P66 P67 P68 P69 P70 P71 P72 P73 P74 P75 P76 P77 P78 P79 P80 P81 P82 P83 P84 P85 P86 P87 P88 P89 P90 P91 P92 P93 P94 P95 P96 P97 P98 P99 P100 P101 P102 P103 P104 P105 P106 P107 P108 P109 P110 P111 P112 P113 P114 P115 P116 P117 P118 P119 P120 P121 P122 P123 P124 P125 P126 P127 P128 P129 P130 P131 P132 P133 P134 P135 P136 P137 P138 P139 P140 P141 P142 P143 P144 P145 P146 P147 P148 P149 P150 P151 P152 P153 P154 P155 P156 P157 P158 P159 P160 P161 P162 P163 P164 P165 P166 P167 P168 P169 P170 P171 P172 P173 P174 P175 P176 P177 P178 P179 P180 P181 P182 P183 P184 P185 P186 P187 P188 P189 P190 P191 P192 P193 P194 P195 P196 P197 P198 P199 P200 P201 P202 P203 P204 P205 P206 P207 P208 P209 P210 P211 P212 P213 P214 P215 P216 P217 P218 P219 P220 P221 P222 P223 P224 P225 P226 P227 P228 P229 P230 P231 P232 P233 P234 P235 P236 P237 P238 P239 P240 P241 P242 P243 P244 P245 P246 P247 P248 P249 P250 P251 P252 P253 P254 P255 P256 P257 P258 P259 P260 P261 P262 P263 P264 P265 P266 P267 P268 P269 P270 P271 P272 P273 P274 P275 P276 P277 P278 P279 P280 P281 P282 P283 P284 P285 P286 P287 P288 P289 P290 P291 P292 P293 P294 P295 P296 P297 P298 P299 P300 P301 P302 P303 P304 P305 P306 P307 P308 P309 P310 P311 P312 P313 P314 P315 P316 P317 P318 P319 P320 P321 P322 P323 P324 P325 P326 P327 P328 P329 P330 P331 P332 P333 P334 P335 P336 P337 P338 P339 P340 P341 P342 P343 P344 P345 P346 P347 P348 P349 P350 P351 P352 P353 P354 P355 P356 P357 P358 P359 P360 P361 A*01:01 M A V M A P R T L L L L L S G A L A L . . T Q T W A G S H S M R Y F F T S V S R P G R G E P R F I A V G Y V D D T Q F V R F D S D A A S Q K M E P R A P W I E Q E G P E Y W D Q E T R N M K A H S Q T D R A N L G T L R G Y Y N Q S E D G S H T I Q I M Y G C D V G P D G R F L R G Y . R Q D A Y D G K D Y . I A L N E D L R S W T A A D M A A Q I T K R K W E A V H A A E . . . . . . . . . . . . . . Q R R V Y L E G R C V D G L R R Y L E N . . . G K E T L Q R T D P P K T H M T H H P I S D H E A T L R C W A L G F Y P A E I T L T W Q R D G E D . Q T Q D T E L V E T R P A G D G T F Q K W A A V V V P S G E E Q R Y T C H V Q H E G L P K P L T L R W E L S S Q P T I P I V G I I A G L V L L G A V I T G A V V A A V M W R R K S S D R K G G S Y T Q A A S S D S A Q G S D V S L T A C K V
尝试与问题
我打算将位置矩阵文件中每一行以P开头的列对应的所有字符值拼接为一个字符串,格式如ABCDEGGH***IHJLMNOP,之后根据'proteins'文件中的HLA字段进行匹配,在'proteins'文件中新增一列名为'HLA amino acid sequence',填入拼接得到的字符串值。
我已经掌握了字符串拼接的基础方法,但无法实现我需要的按行拼接效果,当前代码如下:
positional_matrix <- A_AA_mat_pos concatenated_amino_acid <- c(positional_matrix, sep = "") do.call(paste, positional_matrix) head(concatenated_amino_acid)
查看拼接后结果的head发现,代码是按列将所有值拼接为一个列表,而我想要的是对每一行分别拼接。
解决方案
1. 修正按行拼接逻辑
你之前的写法默认按列处理,R中指定apply的第二个参数为1即可实现按行遍历拼接:
# 筛选所有以P开头的列,排除allele字段 p_columns <- grep("^P", colnames(positional_matrix), value = TRUE) # 按行拼接所有P列的内容,结果存入新列 positional_matrix$concatenated_seq <- apply(positional_matrix[, p_columns], 1, function(row) paste(row, collapse = ""))
2. 处理矩阵跨行存储问题
从你提供的矩阵示例来看,同一个等位基因的序列拆分到了多行存储,第一行带allele名,后续行的allele列为空,需要先合并同一个等位基因的所有行:
# 加载所需包,zoo用于填充空值,dplyr用于分组处理 library(zoo) library(dplyr) # 填充空的allele字段,和上一行非空allele保持一致 positional_matrix$allele <- na.locf(ifelse(positional_matrix$allele == "", NA, positional_matrix$allele), na.rm = FALSE) # 按allele分组,合并所有P列的内容 pos_clean <- positional_matrix %>% group_by(allele) %>% summarise(across(starts_with("P"), ~paste(na.omit(.x), collapse = ""))) %>% ungroup() # 拼接每个等位基因的完整序列 pos_clean$hla_sequence <- apply(pos_clean[, grep("^P", colnames(pos_clean))], 1, paste, collapse = "")
3. 匹配proteins表补全序列
注意proteins表的HLA字段带HLA-前缀,匹配前需要先统一格式:
# 读取proteins文件 proteins <- read.csv("proteins.csv", stringsAsFactors = FALSE) # 生成临时匹配字段,去除HLA前缀 proteins$match_allele <- gsub("^HLA-", "", proteins$HLA) # 匹配序列 proteins <- merge(proteins, pos_clean[, c("allele", "hla_sequence")], by.x = "match_allele", by.y = "allele", all.x = TRUE) # 重命名列并删除临时字段 colnames(proteins)[colnames(proteins) == "hla_sequence"] <- "HLA amino acid sequence" proteins$match_allele <- NULL # 输出结果 write.csv(proteins, "proteins_with_hla_seq.csv", row.names = FALSE)
内容的提问来源于stack exchange,提问作者elomelokeno
相关产品推荐
相关产品推荐

