R语言反向翻译函数报错求助:多氨基酸序列运行异常
R语言反向翻译函数错误排查与修复
问题背景
目标是编写一个R语言反向翻译函数:输入氨基酸序列字符串,为每个氨基酸按预定义频率随机返回对应密码子,后续可调整频率提升稀有密码子选中概率。已基于标准遗传密码定义了codon类及61种编码氨基酸的密码子频率表,但输入多氨基酸序列时出现错误:
- 初始错误:
Error in sum(aa_freqs) : invalid 'type' (list) of argument - 移除频率归一化后错误:
Error in sample.int(length(x), size, replace, prob) : incorrect number of probabilities
单氨基酸输入或逐行运行时正常。
错误原因
- 字符串遍历逻辑错误:当输入是多氨基酸字符串时,
for (aa in protein_sequence)会将整个字符串作为单个元素遍历,而非拆分后的单个氨基酸字符。这导致筛选对应密码子时得到空列表,aa_freqs变成空列表,sum(aa_freqs)自然报错。 - 概率参数不匹配:即使去掉归一化步骤,空的
aa_codons会让sample函数的prob参数长度为0,与待采样的元素数量不匹配,引发第二个错误。
修复方案
核心是将输入的氨基酸字符串拆分为单个字符的向量,确保循环遍历每个氨基酸。同时优化密码子数据的存储结构,提升筛选效率。
修正后的完整代码
# Define codon class codon <- function(sequence, aminoacid, frequency) { new_codon <- list(sequence = sequence, aminoacid = aminoacid, frequency = frequency) class(new_codon) <- "codon" new_codon } # Define the 61 codon frequency table codons <- list( # Alanine (Ala) codons codon("GCT", "A", 0.26), codon("GCC", "A", 0.40), codon("GCA", "A", 0.23), codon("GCG", "A", 0.11), # Cysteine (Cys) codons codon("TGT", "C", 0.45), codon("TGC", "C", 0.55), # Aspartic acid (Asp) codons codon("GAT", "D", 0.46), codon("GAC", "D", 0.54), # Glutamic acid (Glu) codons codon("GAA", "E", 0.42), codon("GAG", "E", 0.58), # Phenylalanine (Phe) codons codon("TTT", "F", 0.45), codon("TTC", "F", 0.55), # Glycine (Gly) codons codon("GGT", "G", 0.16), codon("GGC", "G", 0.34), codon("GGA", "G", 0.25), codon("GGG", "G", 0.25), # Histidine (His) codons codon("CAT", "H", 0.41), codon("CAC", "H", 0.59), # Isoleucine (Ile) codons codon("ATT", "I", 0.36), codon("ATC", "I", 0.48), codon("ATA", "I", 0.16), # Lysine (Lys) codons codon("AAA", "K", 0.42), codon("AAG", "K", 0.58), # Leucine (Leu) codons codon("TTA", "L", 0.07), codon("TTG", "L", 0.13), codon("CTT", "L", 0.13), codon("CTC", "L", 0.20), codon("CTA", "L", 0.07), codon("CTG", "L", 0.41), # Methionine (Met) codon codon("ATG", "M", 1.0), # Asparagine (Asn) codons codon("AAT", "N", 0.46), codon("AAC", "N", 0.54), # Proline (Pro) codons codon("CCT", "P", 0.28), codon("CCC", "P", 0.33), codon("CCA", "P", 0.27), codon("CCG", "P", 0.11), # Glutamine (Gln) codons codon("CAA", "Q", 0.25), codon("CAG", "Q", 0.75), # Arginine (Arg) codons codon("CGT", "R", 0.08), codon("CGC", "R", 0.19), codon("CGA", "R", 0.11), codon("CGG", "R", 0.21), codon("AGA", "R", 0.20), codon("AGG", "R", 0.20), # Serine (Ser) codons codon("TCT", "S", 0.18), codon("TCC", "S", 0.22), codon("TCA", "S", 0.15), codon("TCG", "S", 0.06), codon("AGT", "S", 0.15), codon("AGC", "S", 0.24), # Threonine (Thr) codons codon("ACT", "T", 0.24), codon("ACC", "T", 0.36), codon("ACA", "T", 0.28), codon("ACG", "T", 0.12), # Valine (Val) codons codon("GTT", "V", 0.18), codon("GTC", "V", 0.24), codon("GTA", "V", 0.11), codon("GTG", "V", 0.47), # Tryptophan (Trp) codon codon("TGG", "W", 1.0), # Tyrosine (Tyr) codons codon("TAT", "Y", 0.43), codon("TAC", "Y", 0.57) ) # 优化:将codons列表转换为数据框,方便快速筛选 codon_df <- do.call(rbind, lapply(codons, function(x) { data.frame(sequence = x$sequence, aminoacid = x$aminoacid, frequency = x$frequency, stringsAsFactors = FALSE) })) # Define function to generate new sequence random_sequence <- function(protein_sequence) { # 将氨基酸字符串拆分为单个字符的向量 aa_vector <- strsplit(protein_sequence, "")[[1]] new_sequence <- character(length(aa_vector)) for (i in seq_along(aa_vector)) { aa <- aa_vector[i] # 从数据框中筛选当前氨基酸的密码子 aa_codons <- codon_df[codon_df$aminoacid == aa, ] # 按频率随机选择密码子 selected_codon <- sample(aa_codons$sequence, 1, prob = aa_codons$frequency) new_sequence[i] <- selected_codon } paste(new_sequence, collapse = "") } # Example usage protein_sequence <- "MAVVDLKECEILHTWVFPKKKHGEARNDDCQQGKPST" set.seed(123) # 固定随机种子以便复现 random_sequence(protein_sequence)
关键修复点
- 字符串拆分:用
strsplit(protein_sequence, "")[[1]]将输入字符串拆分为单个氨基酸字符的向量,确保循环遍历每个氨基酸。 - 数据结构优化:将
codons列表转换为数据框codon_df,筛选密码子更直观高效,避免列表操作的复杂逻辑。 - 简化频率处理:原数据中每个氨基酸的密码子频率已经归一化(总和为1),无需额外归一化步骤;若后续调整频率后总和不为1,可添加
aa_codons$frequency <- aa_codons$frequency / sum(aa_codons$frequency)确保概率合法。
验证结果
运行示例代码,固定随机种子后会得到稳定的输出,例如:[1] "ATGGCCGTAGTCGACCTGAAAGAGTGTGAGATCCTGCACACCTGGTGGTTCCTAAGAAAAAGCACGGAGAAGCCCGCAACGACGACTGCCAGCAAGGCAAGCCTAGTACA"
内容的提问来源于stack exchange,提问作者yold6
相关产品推荐
相关产品推荐

